![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
ViGOur |
![]()
Сообщение
#1
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Мы же все не глупые, так что получаем ответ не используя компилятор!
![]() И для тренировки мозга, каков будет результат, если func сделать виртуальной функцией? ![]() То что ниже этой темы читаем после того, как ответили на задачку... ![]() |
|
|
ViGOur |
![]()
Сообщение
#2
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
Желательно пишем, почему вы считаете, что будет именно этот ответ, а не другой.
![]() |
|
|
void* |
![]()
Сообщение
#3
|
![]() Программист-самоучка ![]() ![]() ![]() Группа: Участник Сообщений: 429 Регистрация: 4.6.2008 Пользователь №: 193 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
проголосовал за А С
вроде бы все логично, вначале вызывается operator() класса A, т.к. он public и наследование public, ну а затем C::func() если будет виртуальной... то так же само будет я думаю П.С. хорошая тема, давайте побольше таких задачек кидать, охота мозги размять хоть немного ![]() все правильно, только что проверил в компиляторе ![]() блин, а вот насчет виртуальной функции я недостаточно подумал и ошибся ![]() |
|
|
ViGOur |
![]()
Сообщение
#4
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Kagami |
![]()
Сообщение
#5
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Мне кажется что ответ С С
Оператор () вызывает на func() без указания имени класса, поэтому мне кажется что вызывается C::func() Ну а вызов func() естественно будет C::func(). Если объявить функцию виртуальной, ничего не изменится UPD: проверил себя на компиляторе и расстроился ![]() Зато хоть про виртуальную версию оказался прав ![]() Сообщение отредактировал Kagami - 11.2.2009, 10:03 |
|
|
ViGOur |
![]()
Сообщение
#6
|
![]() Мастер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Kagami |
![]()
Сообщение
#7
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Я голосовал
![]() |
|
|
berserk |
![]()
Сообщение
#8
|
![]() Студент ![]() Группа: Участник Сообщений: 44 Регистрация: 9.2.2009 Пользователь №: 540 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Мне кажется что ответ С С Оператор () вызывает на func() без указания имени класса, поэтому мне кажется что вызывается C::func() Ну а вызов func() естественно будет C::func(). Если объявить функцию виртуальной, ничего не изменится UPD: проверил себя на компиляторе и расстроился ![]() Зато хоть про виртуальную версию оказался прав ![]() Также проголосовал((( надо бы книжку почитать |
|
|
kwisp |
![]()
Сообщение
#9
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
я вот под пивом и то верно ткнул.
надо чего-нить с шаблонами и множественным наследованием сообразить что бы прям уххх как проняло. |
|
|
Влад |
![]()
Сообщение
#10
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
1. c(); По правилу поиска имен, будет найдена функция A::operator()(). При ее выполнении, будет произведен вызов A::func(), поскольку func() - невиртуальная и связывание произойдет еще на этапе компиляции.
2. c.func(); А вот при этом вызове будет напрямую вызвана функция C::func(), разумеется. Поэтому вывод будет: Цитата class A
class C |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 12:41 |