Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2013, 22:08   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
не может быть вызван в принцыпе, поскольку этой функции не существует. Кроме того, через Classname::FunctionName() можно вызвать только статические функции.
http://codepad.org/NQbQ9NjJ

Через Classname::FunctionName() можно вызывать только статический.
Но через указатель/ссылку/имя объекта вполне можно вызывать любые методы, квалифицированные именами предков.

Последний раз редактировалось _Bers; 30.07.2013 в 23:49.
_Bers вне форума Ответить с цитированием
Старый 30.07.2013, 22:16   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от I_I_I Посмотреть сообщение
Но откуда указателю pb удается вызвать
Код:
 pb->A::print()
? Ведь адреса этой функции нет в его виртуальной таблице (как я полагаю). Кто знает?
Взгляни сюда:
http://ideone.com/cmRPnJ

Класс потомка тащит на борту сразу две версии методов: свой собственный, и метод предка.

При этом не важно, виртуальные они, или нет.
Если методы виртуальные - то через указатель на предка можно запустить метод потомка, и не более того.

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

Но по умолчанию, от имени потомка компилятор запустит версию самого потомка.
_Bers вне форума Ответить с цитированием
Старый 31.07.2013, 04:06   #13
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Версию предка всегда можно запустить от имени потомка, если явно указать имя предка, что бы компилятор смог понять, какую нужно выбрать версию метода.
у Саттера я тоже такие примеры видел. Зачем это нужно - не понял (не представляю) - ниразу не пришлось такого кода писать (есть подозрение, что этот код будет нехорошим, сильно все запутывает).

Например, если ты в A::f() вызываешь явно B::g(), а в B::g() вызываешь виртуальный метод h() - то надо учесть, что вызовется A::h(), но ведь B про A (и то как там реализован h) может ниче и не знать. Вывод - все эпически запутано (и классы оказались сильно связаны), бутылка водки не поможет, а какой полезный эффект можно с этого извлечь?
ЗЫ.Тут A и B имеют общего предка, кнешно.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по функциям miragex Общие вопросы C/C++ 5 06.01.2013 00:13
C++ Вопрос по виртуальным методам Selestis Помощь студентам 5 09.09.2011 18:18
вопрос по функциям . Goratics Общие вопросы C/C++ 5 17.07.2011 12:42
Вопрос по функциям Antowka Паскаль, Turbo Pascal, PascalABC.NET 6 08.12.2008 22:45
глупый вопрос по функциям steck Общие вопросы Delphi 2 17.06.2007 15:40