#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 物件模...