轉自http://blog.csdn.net/pathuang68/article/details/4101977
內容概要:
滿足下面2個條件時,
1. 父類有虛函數,子類也有虛函數,但子類並沒有重寫或覆蓋父類的虛函數
2. 非虛繼承
類對象之內存佈局
續前篇:http://blog.csdn.net/pathuang68/archive/2009/04/23/4101970.aspx
如果在Derived類中增加一個下面的虛函數,會怎麼樣呢?Base類和Derived類之間的關係如下:
新加入的虛函數定義如下:
inline virtual void vfDerived()
{
cout << "This is in Derived::vfDerived()" << endl;
}
運行結果如下:
Derived對象的memory layout圖解如下:
我們發現,Derived類本身並沒有因爲增加了一個虛函數,而增加一個vptr,這是因爲編譯器將Derived類中定義的虛函數加入到了其基類的虛函數表中,Derived因此共用了基類Base的vptr,就象是它自己的一樣(其實當然也是Derived類自己的,因此Base subobject都被Derived包含了)。爲什麼說這個vptr是Base的呢?因爲基類在派生類中必須保證其所謂的“原始的完整性”。