多重繼承
繼承關係大於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個區域 區 存放函式體的二進位制 由作業系統進行管理 你寫的 都轉化成二進位制 全域性區 存放全域性變數和靜態變數以及常量 棧區 由編譯器自動分配和釋放,存放函式的引數值,區域性變數等 堆區 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統 記...