![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Brain89 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 18.1.2010 Репутация: нет Всего: 2 |
Есть следующая иерархия классов (MSVS):
В методе void C::Method_B(); есть такой код:
Т.е. вызываю метод, определенный в классе B и наследованный классом C. В реализации этого метода (void B:: Method()) есть вызов:
Т.е. хочу вызвать метод, наследованный классом B от класса IA и переопределенный в классе B. Но происходит вызов метода C::Method_A(). Почему так и как это исправить? |
||||||
|
|||||||
baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
потому что Method_A() виртуальная
если в B:: Method() требуется всегда вызывать B::Method_A(), это надо указать явно:
|
||||||
|
|||||||
Brain89 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 18.1.2010 Репутация: нет Всего: 2 |
baldina,
Меня больше интересует, почему именно так происходит. Если я все верно понимаю, то при вызове C::Method_B() происходит вызов C::Method_B(). Так как этот метод принадлежит классу C, то и при его реализации указатель this является указателем на объект класса C. Поэтому, когда в я вызываю Method, то вызов происходит такой: C::B::Method(). Когда же вызываю Method_A в классе B, то получается, что на самом деле C::Method_A(), а не C::B::Method_A()? И решается это только явным указанием, какую реализацию вызвать в теле класса B? |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
это полиморфизм. тип объекта определяется динамически, и вызывается правильная функция. т.е. когда вызов происходит внутри B::Method(), настоящий тип объекта - С. поскольку Method_A() виртуальная, происходит поиск соответствующей функции, т.е. C::Method_A();
посмотрите еще вот такой пример: http://liveworkspace.org/code/f7c7d636fd4b...32ae1b24ce294c5 вообще полиморфное поведение в С++ означает, что при работе с указателем на базовый класс, виртуальные функции вызываются с учетом истинного производного типа. пример общего характера: http://codepad.org/hIl6E3ei Добавлено через 2 минуты и 39 секунд кстати множественное наследование в данном случае не причем. |
|||
|
||||
Brain89 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 18.1.2010 Репутация: нет Всего: 2 |
baldina,
Спасибо. Теперь понял. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |