在项目27“有效的C++”的(第3版,第118页),斯科特Meyers表示:派生类对象有多个地址?
class Base { ... };
class Derived: public Base { ... };
Derived d;
Base *pb = &d;
这里我们只是创建一个基类指针指向一个派生类对象,但有时这两个指针不会一样。当出现这种情况时,在运行时将偏移量应用到
Derived*
指针,以获取正确的Base*
指针值。这最后一个实施例表明,一个单一的对象(例如,
Derived
类型的对象)可能具有多个地址(例如,当在由Derived*
指针指向由Base*
指针和其地址指向它的地址) 。
这里有点让人费解。我知道指向基类的指针可以在运行时指向派生类的对象,这称为多态或动态绑定。但派生类对象在内存中是否真的有多个地址?
猜猜我有一些误解在这里。有人可以澄清一下吗?也许这与C++编译器中如何实现多态性有关。
“与单继承它通常是” - 你能想到的任何情况下,它*不会*? – us2012 2013-02-08 16:10:04
@ us2012:非多态基类,多态派生类,在派生类中偏移量0处添加的vtable指针,后跟基类。 – MSalters 2013-02-08 16:26:58
@ MSalters很好!谢谢。 – us2012 2013-02-08 16:27:54