Я предполагаю, что вы хотите знать структуру памяти полиморфных объектов. Я постараюсь показать это визуально. Рассмотрим:
class Base()
{
public:
virtual void foo();
virtual void bar();
void hello();
private:
int variable1;
};
class Derived : public Base
{
public:
virtual void foo();
virtual void bar();
void bye();
private:
float variable2;
};
(Примечание для педантов: виртуальный деструктор намеренно опущен для ясности.)
Схема памяти будет выглядеть примерно так:
/*
Base object layout:
[vftable pointer] (points to the 1st row in the virtual function table)
[int variable1 ] (from Base)
Derived object layout:
[vftable pointer] (points to the 2nd row in the virtual function table)
[int variable1 ] (inherited from Base)
[float variable2] (from Derived)
virtual function table layout:
[&Base::foo ] [&Base::bar ]
[&Derived::foo] [&Derived::bar]
*/
Обратите внимание, что во всей программе имеется только одна таблица виртуальных функций для Base и Derived. Таблица не дублируется для каждого экземпляра Derived. Вместо этого каждый производный экземпляр содержит скрытый указатель на «строку» таблицы виртуальных функций.
Также обратите внимание, что hello () и bye () не отображаются в таблице vf, поскольку они не являются виртуальными. Правильный указатель функции тоже вызов в этом случае можно выяснить во время компиляции.
В этой статье Википедии также показан пример расположения памяти, но он более сложный, поскольку в этом примере используется множественное наследование.
Идея Чипа Уни об использовании отладчика для просмотра того, что происходит в памяти, было бы отличным упражнением.
Для более опытных программистов другим хорошим упражнением будет попытка реализовать полиморфизм в C с использованием структур и указателей на функции.