在此鏈結中
物件空間的最開始四位元組內容,就是虛表(虛函式列表)的位址,叫虛指標
把虛表強轉為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 中虛函式繼承,虛表剖析
虛表概念 對於有虛函式類,編譯器都會維護一張虛表,物件的前四個位元組就是指向虛表的指標。虛表中存放的是虛函式的位址。虛函式按照其宣告順序存放在虛表中。在派生類中,前面是繼承基類的虛函式,若派生類重寫了基類中的虛函式則替換為重寫後的,派生類自己的虛函式追加在其後。如果派生類繼承了兩個基類,則派生類自己...