C 獲取虛表中的函式並呼叫

2021-09-02 16:22:35 字數 1102 閱讀 9375

在此鏈結中

物件空間的最開始四位元組內容,就是虛表(虛函式列表)的位址,叫虛指標

把虛表強轉為int*,這樣虛表就剛好是乙個int型陣列了

如:

base *base = new subclass;
*(int*)base    這個是指得到物件空間最開始的4位元組內容,也就是虛表位址

(int*)*(int*)base    這樣做虛表的首位址就變成了int*了

*(int*)*(int*)base    得到這個陣列的首元素了!

可以改為如下的寫法:

*((int*)*(int*)base + 0)    第1個虛函式

*((int*)*(int*)base + 1)    第2個虛函式

定義函式指標去呼叫,如下所示:

typedef void (*p)();

((p)(*((int*)*(int*)base + 0)))();    這樣就可以呼叫了

如何找虛表的尾巴:

int *pp = (int*)*((int*)*(int*)base + 3);
這裡給出完整的例子,原始碼如下:

#include using namespace std;

class base

virtual void print2()

virtual void print3()

virtual ~base()

};class subclass: public base

void print3()

virtual ~subclass()

};void main()

執行截圖如下:

尾部如下:

C 建構函式中呼叫虛函式

我們知道 c 中的多型使得可以根據物件的真實型別 動態型別 呼叫不同的虛函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛函式,會怎麼樣呢?有這麼一段 class a virtual void func void test public int m ival class b publ...

C 建構函式中呼叫虛函式

談談關於建構函式中呼叫虛函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。測試平台 vs2013 win7x64 乙個例子 include include class base public virtual void func class deri public base public virtu...

c 中虛函式繼承,虛表剖析

虛表概念 對於有虛函式類,編譯器都會維護一張虛表,物件的前四個位元組就是指向虛表的指標。虛表中存放的是虛函式的位址。虛函式按照其宣告順序存放在虛表中。在派生類中,前面是繼承基類的虛函式,若派生類重寫了基類中的虛函式則替換為重寫後的,派生類自己的虛函式追加在其後。如果派生類繼承了兩個基類,則派生類自己...