C 物件模型之記憶體布局(2)

2021-09-14 05:12:49 字數 4216 閱讀 3215

多重繼承

繼承關係大於2,至少有父類,子類,孫子類三代關係。 

使用vs2017檢視物件記憶體布局如下: 

class c size(20):

+---

0 | +--- (base class b)

0 | | +--- (base class a)

0 | | |

4 | | | a1

8 | | | a2

| | +---

12 | | b1

| +---

16 | c1

+---

c::$vftable@:

| &c_meta

| 0

0 | &c::a1

1 | &a::a2

2 | &a::a3

3 | &b::b1

4 | &c::b2

5 | &c::c1

例項驗證:

#include using namespace std;

class a

; ~a() {};

virtual void a1() ;

virtual void a2() ;

virtual void a3() ;

protected:

int a1;

int a2;

};class b : public a

; ~b() {};

virtual void b1() ;

virtual void b2() ;

virtual void a1() ;

protected:

int b1;

};class c : public b

; ~c() {};

virtual void c1() ;

virtual void b2() ;

virtual void a1() ;

protected:

int c1;

};typedef void(*pfun)(); //函式指標

int main()

cout << *((long *)*(long*)bp + 5) << endl;

system("pause");

}

執行結果:  

c::a1()

a::a2()

a::a3()

b::b1()

c::b2()

c::c1()

1512644

請按任意鍵繼續. . .

與物件記憶體布局圖一致。

多繼承

乙個子類的父類不止乙個,定義三個類

多繼承的記憶體布局與單繼承和多重繼承不一樣,子類繼承乙個父類,子類就有乙個虛函式表,當子類繼承兩個父類時,子類就有兩個虛函式表,而且子類自己定義的虛函式放在第乙個繼承的虛函式表中。

例項驗證:

#include using namespace std;

class a

; ~a() {};

virtual void a1() ;

virtual void a2() ;

virtual void a3() ;

protected:

int a1;

int a2;

};class b

; ~b() {};

virtual void b1() ;

virtual void b2() ;

protected:

int b1;

};class c : public a, public b

; ~c() {};

virtual void c1() ;

virtual void b1() ;

virtual void a1() ;

protected:

int c1;

};typedef void(*pfun)(); //函式指標

int main()

cout << "b的虛函式表" << endl;

long* cp = (long*)bp + 3;

for (size_t i = 0; i < 2; i++)

cout << *((long *)*cp + 2) << endl;

system("pause");

}

執行結果:

a的虛函式表

c::a1()

a::a2()

a::a3()

c::c1()

b的虛函式表

c::b1()

b::b2()

0請按任意鍵繼續. . .

與物件記憶體布局圖一致。

參考文件:

C 物件模型之記憶體布局

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

C 物件模型 記憶體布局

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

c 之記憶體模型

c 程式在執行時,將記憶體大方向劃分為4個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...