Задачка в общем и не задачка, особенности работы с классами... |
Здравствуйте, гость ( Вход | Регистрация )
Задачка в общем и не задачка, особенности работы с классами... |
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 |
|
|
|
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:48
Сообщение
#7
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
Я голосовал Первым. Просто комментарий только сейчас написал
|
|
|
berserk |
21.8.2009, 16:41
Сообщение
#8
|
Студент Группа: Участник Сообщений: 44 Регистрация: 9.2.2009 Пользователь №: 540 Спасибо сказали: 0 раз(а) Репутация: 0 |
Мне кажется что ответ С С Оператор () вызывает на 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 |
|
|
Текстовая версия | Сейчас: 29.11.2024, 19:50 |