在項目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