C 物件模型探索 子類的記憶體布局

2021-09-28 15:00:20 字數 1145 閱讀 7253

#include class father

public:

void func_father()

private:

int father;

};class mother

public:

void func_mother()

private:

int mother;

};class son : public father,

public mother

public:

void func_son()

private:

int son;

};int main()

結果:

i am father,this is 0xffffcc14

i am mother,this is 0xffffcc18

i am son,this is 0xffffcc14

傳入 fahter::func_father() 的 this 指標是 0xffffcc14

傳入 mother::func_mother() 的 this 指標是 0xffffcc18

傳入 son::func_son() 的 this 指標是 0xffffcc14

由上述**可知,子類的記憶體布局如下圖所示, 

由於「son」繼承順序是「father」、「mother」,所以記憶體布局中 father 類排布在起始位置,之後是 mother 類,最後才是 son 類自身的變數(當然,初始化順序也是 father 、mother,最後才是 son )。

具體為什麼記憶體布局中只有變數而沒有函式的原因,請看鏈結。 

最後還有乙個問題,為什麼 son 的物件呼叫可以呼叫 father 和 mother 類的函式呢?因為編譯器在呼叫 father 和 mother 的函式時,調整了傳入到 func_father 和 func_mother 函式的 this 指標,使 this 指標是各個函式所在類的物件的 this 指標,從而達到了呼叫各個類的函式的目的。

(saw:game over!)

C 物件記憶體模型探索

實驗環境 ubuntu 18.04 64 bit gcc 7.3.0 g 7.3.0,編譯使用 m32選項啟用32位環境 實驗步驟 1 不含有虛函式的基類,如下 include class base private int i int main 執行結果 kevin kvm study temp g...

C 物件模型 記憶體布局

聯絡人 石虎暱稱 嗡嘛呢叭咪哄 一 概念 1 沒有繼承情況,vptr存放在物件的開始位置,以下是base1的記憶體布局 m idata 100 2.單繼承的情況下,物件只有乙個vptr,它存放在物件的開始位置,派生類子物件在父類子物件的最後面,以下是d1的記憶體布局 b1 m idata 100 b...

C 物件模型之記憶體布局

c 虛函式表解析 虛函式按照其宣告順序放於表中 父類的虛函式在子類的虛函式前面 覆蓋的函式被放到了虛表中原來父類虛函式的位置 沒有被覆蓋的函式依舊 每個父類都有自己的虛表 子類的成員函式被放到了第乙個父類的表中 所謂的第乙個父類是按照宣告順序來判斷的 待補充 c 物件模型之記憶體布局 1 c 物件模...