對象內存佈局 (2)

轉自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因此共用了基類Basevptr,就象是它自己的一樣(其實當然也是Derived類自己的,因此Base subobject都被Derived包含了)。爲什麼說這個vptrBase的呢?因爲基類在派生類中必須保證其所謂的“原始的完整性”。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章