Виртуальные функции вызываются через специальную таблицу, которая назначается объекту в конструкторе, в ваше примере виртуальных таблиц две:
Далее, к какому бы типу объекта Вы не приводили указатель, закреплённая таблица за объектом не меняется.
Все вызовы виртуальных функций, на самом деле стоит читать как "вызвать функцию из таблицы под номером N"
Почитайте про полиморфизм.
Для лучшего понимая можно привести следующий пример:
CTest1 | CTest2 |
---|---|
CTest1::~CTest1 | CTest2::~CTest2() |
CTest1::func2 | CTest2::func2 |
CTest1::func3 | CTest1::func3 |
Далее, к какому бы типу объекта Вы не приводили указатель, закреплённая таблица за объектом не меняется.
Все вызовы виртуальных функций, на самом деле стоит читать как "вызвать функцию из таблицы под номером N"
Почитайте про полиморфизм.
Для лучшего понимая можно привести следующий пример:
class CAnimal { public: virtual string Sound() { return(""); } }; class CCat : public CAnimal { public: virtual string Sound() { return("Мяу"); } }; class CDog : public CAnimal { public: virtual string Sound() { return("Гав"); } }; void OnStart() { CAnimal *animal[2]; animal[0]=new CCat(); animal[1]=new CDog(); //-- for(int i=0;i<ArraySize(animal);i++) Print(animal[i].Sound()); //--- delete animal[0]; delete animal[1]; }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
При попытке понять поведение виртуальных функций через справку складывается впечатление о постоянном замещении.
Вот код для проверки:
По результатам видно (я в коде строки пометил), что реальное замещение (подмена) происходит только при вызове через указатель, а всё остальное - это наследственность.
Выложил, как пример, но может есть ещё неучтённые мной возможности?
Была мысль, что в func3() typename(this) вернет имя наследника, но это оказалось лишь мечтой...