C 物件模型 虛函式表分析

2021-10-10 06:28:40 字數 2700 閱讀 3107

class base

virtual void g()

virtual void h()

};class derive :public base };

int main()

typedef void(*func)(void); //定義乙個函式指標型別

func f = (func)vptr[0]; //f就是函式指標變數。 vptr[0]是指向第乙個虛函式的。

func g = (func)vptr[1];

func h = (func)vptr[2];

/*func i = (func)vptr[3];

func j = (func)vptr[4];*/

f();

g();

h();

//i();

base *dpar = new base();

long *pvptrpar = (long *)dpar;

long *vptrpar = (long *)(*pvptrpar);

for (int i = 0; i <= 4; i++) //迴圈5次;

不管是父類還是子類,都只會有乙個虛函式表,不能認為子類中有乙個虛函式表+父類中有乙個虛函式表,從而得到乙個結論:子類中有兩個虛函式表。

子類中是否可能會有多個虛函式表呢?後續講解。

如果子類中完全沒有新的虛函式,則可以認為子類的虛函式表和父類的虛函式表內容相同。

超出虛函式表部分內容不可知

typedef void(*func)(void); //定義乙個函式指標型別

derive derive;

long *pvptrderive = (long *)(&derive);

long *vptrderive = (long *)(*pvptrderive); //0x00b09b6c

func f1 = (func)vptrderive[0]; //0x00b0119f

func f2 = (func)vptrderive[1]; //0x00b0150f

func f3 = (func)vptrderive[2]; //0x00b01325

func f4 = (func)vptrderive[3]; //0x69726544

func f5 = (func)vptrderive[4]; //0x3a3a6576

derive derive2 = derive; //呼叫拷貝建構函式

long *pvptrderive2 = (long *)(&derive2);

long *vptrderive2 = (long *)(*pvptrderive2);//和derive指向虛函式表指標值相同

base base = derive;

long *pvptrbase = (long *)(&base);

long *vptrbase = (long *)(*pvptrbase); //0x00b09b34

func fb1 = (func)vptrbase[0]; //0x00b0119f

func fb2 = (func)vptrbase[1]; //0x00b01177 //與子類不同

func fb3 = (func)vptrbase[2]; //0x00b01325

func fb4 = (func)vptrbase[3]; //0x00000000

func fb5 = (func)vptrbase[4]; //0x65736142

這裡編譯器給做了乙個選擇,顯然derive初始化base物件的時候,derive的虛函式表指標值並沒有覆蓋base物件的虛函式表指標值,編譯器幫我們做到了這點;

oo(物件導向)  和ob(基於物件)概念

base *pbase = new derive();

base &base2 = derive2;

物件記憶體模型(虛函式,虛函式表,虛指標)

從例子入手,考察如下帶有虛函式的類的物件記憶體模型 1 class a 11 12 class b a 20 21 class c b 注 在子類中出現與父類相同名稱的變數和非虛函式不是最佳實踐,這裡是為了說明其記憶體結構。其物件記憶體結構見下圖。於侯捷老師 對其分析如下 1.每個含有虛函式的類在記...

Cpp 物件模型探索 多重繼承虛函式表分析

include class base1 virtual void func12 virtual void func13 virtual void func14 class base2 virtual void func22 virtual void func23 class son public b...

虛函式表分析

project100.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include using namespace std 父類 class base virtual voidg virtual voidh class derive public bas...