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