В пункте 27 "Эффективный С++" (3-е издание, стр. 118) Скотт Мейерс сказал:
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
Здесь мы просто создаем указатель базового класса на объект производного класса, но иногда два указателя не будут одинаковыми. Когда этот случай, смещение применяется во время выполнения к указателю
Derived*
, чтобы получить правильное значение указателяBase*
.Этот последний пример демонстрирует, что один объект (например, объект типа
Derived
) может иметь более одного адреса (например, его адрес при указании указателемBase*
и его адресом при указанииDerived*
).
Вот немного сложно понять. Я знаю, что указатель на базовый класс может указывать на объект производного класса во время выполнения, это называется полиморфизмом или динамической привязкой. Но действительно ли у объекта производного класса в памяти больше 1 адреса?
Угадайте, у меня есть недоразумение. Может кто-нибудь дать некоторые разъяснения? Может быть, это имеет какое-то отношение к тому, как полиморфизм реализуется в компиляторе С++?