crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Задачка в общем и не задачка
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 24.8.2009, 9:38
  1. c(); По правилу поиска имен, будет найдена функция A::operator()(). При ее выполнении, будет произведен вызов A::func(), поскольку func() - невиртуальная и связывание произойдет еще на этапе компиляции.
2. c.func(); А вот при этом вызове будет напрямую вызвана функция C::func(), разумеется.
Поэтому вывод будет:
Цитата
class A
class C
kwisp Дата 21.8.2009, 22:32
  я вот под пивом и то верно ткнул.
надо чего-нить с шаблонами и множественным наследованием сообразить
что бы прям уххх как проняло.
berserk Дата 21.8.2009, 16:41
 
Цитата(Kagami @ 11.2.2009, 11:01) *
Мне кажется что ответ С С
Оператор () вызывает на func() без указания имени класса, поэтому мне кажется что вызывается C::func()
Ну а вызов func() естественно будет C::func().
Если объявить функцию виртуальной, ничего не изменится

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


Также проголосовал((( надо бы книжку почитать
Kagami Дата 11.2.2009, 10:48
  Я голосовал :) Первым. Просто комментарий только сейчас написал
ViGOur Дата 11.2.2009, 10:08
 
Цитата(Kagami @ 11.2.2009, 10:01) *
UPD: проверил себя на компиляторе и расстроился :(
Это не повод для расстройства, а повод для освежения памяти чтением книг. Всего ведь не упомнишь. :)

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

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

Сами также при случае создавайте темы с подобными задачками.
void* Дата 10.2.2009, 20:36
  проголосовал за А С
вроде бы все логично, вначале вызывается operator() класса A, т.к. он public и наследование public, ну а затем C::func()
если будет виртуальной... то так же само будет я думаю

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


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

блин, а вот насчет виртуальной функции я недостаточно подумал и ошибся :)
ViGOur Дата 10.2.2009, 20:05
  Желательно пишем, почему вы считаете, что будет именно этот ответ, а не другой. :)
ViGOur Дата 10.2.2009, 17:48
  Мы же все не глупые, так что получаем ответ не используя компилятор! :)
#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 сделать виртуальной функцией? :)

То что ниже этой темы читаем после того, как ответили на задачку... ;)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 20:41