Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Задачка в общем и не задачка
Форум на CrossPlatform.RU > Разработка > С\С++
ViGOur
Мы же все не глупые, так что получаем ответ не используя компилятор! :)
#include <iostream>

class A
{
public:
    void operator()()
    {
        func();
    }
    void func()
    {
        std::cout << "class A" << std::endl;
    }
};

class B: public A
{
public:
    void func()
    {
        std::cout << "class B" << std::endl;
    }
};

class C: public B
{
public:
    void func()
    {
        std::cout << "class C" << std::endl;
    }
};


int main(int argc, char *argv[])
{

    C c;
    c();

    c.func();

    return 0;
}
И для тренировки мозга, каков будет результат, если func сделать виртуальной функцией? :)

То что ниже этой темы читаем после того, как ответили на задачку... ;)
ViGOur
Желательно пишем, почему вы считаете, что будет именно этот ответ, а не другой. :)
void*
проголосовал за А С
вроде бы все логично, вначале вызывается operator() класса A, т.к. он public и наследование public, ну а затем C::func()
если будет виртуальной... то так же само будет я думаю

П.С. хорошая тема, давайте побольше таких задачек кидать, охота мозги размять хоть немного :)


все правильно, только что проверил в компиляторе :) значит я прав

блин, а вот насчет виртуальной функции я недостаточно подумал и ошибся :)
ViGOur
Цитата(void* @ 10.2.2009, 20:36) *
хорошая тема, давайте побольше таких задачек кидать, охота мозги размять хоть немного
Договорились! :)

Сами также при случае создавайте темы с подобными задачками.
Kagami
Мне кажется что ответ С С
Оператор () вызывает на func() без указания имени класса, поэтому мне кажется что вызывается C::func()
Ну а вызов func() естественно будет C::func().
Если объявить функцию виртуальной, ничего не изменится

UPD: проверил себя на компиляторе и расстроился :(
Зато хоть про виртуальную версию оказался прав :)
ViGOur
Цитата(Kagami @ 11.2.2009, 10:01) *
UPD: проверил себя на компиляторе и расстроился :(
Это не повод для расстройства, а повод для освежения памяти чтением книг. Всего ведь не упомнишь. :)

Kagami, чего не проголосовал?
Kagami
Я голосовал :) Первым. Просто комментарий только сейчас написал
berserk
Цитата(Kagami @ 11.2.2009, 11:01) *
Мне кажется что ответ С С
Оператор () вызывает на func() без указания имени класса, поэтому мне кажется что вызывается C::func()
Ну а вызов func() естественно будет C::func().
Если объявить функцию виртуальной, ничего не изменится

UPD: проверил себя на компиляторе и расстроился :(
Зато хоть про виртуальную версию оказался прав :)


Также проголосовал((( надо бы книжку почитать
kwisp
я вот под пивом и то верно ткнул.
надо чего-нить с шаблонами и множественным наследованием сообразить
что бы прям уххх как проняло.
Влад
1. c(); По правилу поиска имен, будет найдена функция A::operator()(). При ее выполнении, будет произведен вызов A::func(), поскольку func() - невиртуальная и связывание произойдет еще на этапе компиляции.
2. c.func(); А вот при этом вызове будет напрямую вызвана функция C::func(), разумеется.
Поэтому вывод будет:
Цитата
class A
class C
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.