物件記憶體布局 14

2021-08-23 14:50:00 字數 1380 閱讀 9752

前篇:

繼續**虛基類對物件記憶體布局的影響。幾個類的繼承關係如下圖,這是虛基類最為常見的用法之一:

**如下:

#include

using namespace std;

class base ;

class derived1 : public virtual base ;

class derived2 : public virtual base ;

class childderived : public derived1, public derived2 ;

int main(void)

執行結果如下:

sizeof(base) = 4 bytes,這個是很好解釋的,因為base中由乙個型別為int的成員變數。

sizeof(derived1) = 12 bytes和sizeofderived2) = 12 bytes,**如下:

兩個「?」到底是多少我們且不去管它,等我們討論childderived物件的memory layout時再進行詳細說明。從上圖可以看到,base subobject在最後。

現在我們來看看childderived物件的memory layout的情況:

由於derived1和derived2都是從base虛擬繼承而來,因而base是它們的虛基類,編譯器在編譯的時候會分別給他們安插vbptr指標;derived1和derived2同時被childderived普通繼承(非虛繼承),根據c++標準的要求,基類在在派生類中保證其原始的完整性,因此兩個vbptr被繼承到了childderived類;由於base被虛繼承,可以看到base suboject只有乙份拷貝,而且放在最後。

從下面**可以很清楚地發現:

sizeof(childderived) = 24 bytes;

虛基類例項位址(0x0012ff7c) = derived1的vbptr (0x0012ff68) + derived1的vbptr到虛基類例項位址的偏移量(24);

虛基類例項位址(0x0012ff7c) = derived2的vbptr (0x0012ff70) + derived1的vbptr到虛基類例項位址的偏移量(12)

後篇:

物件記憶體布局 1

內容概要 滿足下面2個條件時,1.父類有虛函式,子類無虛函式 即無虛函式重寫或無虛函式覆蓋 2.非虛繼承 類物件之記憶體布局1.base類中有兩個虛函式vfbase 1 vfbase 2 和乙個整形成員變數m base,derived類中有乙個整形成員變數m derived,二者的關係如下 如下 i...

物件記憶體布局 3

內容概要 滿足下面2個條件時,1.父類無虛函式,子類有虛函式 2.非虛繼承 類物件之記憶體布局 前篇 http blog.csdn.net pathuang68 archive 2009 04 23 4101977.aspx 如果將base中的兩個虛函式刪除,情況有會怎麼樣呢?將base中的兩個虛函...

物件記憶體布局 7

前篇 在物件記憶體布局 5 的 中,在derived類中覆蓋base1中宣告的vfbase1 1 其他 不變。修改後的derived的定義如下 class derived public base1,public base2,public base3 inline void vfbase1 1 執行結...