虛函數:實現多態的機制,多態就是用父類型的指針指向其子類的實例,然后通過父類的指針調用實際子類的成員函數。讓父類的指針有“多種形態”,一種泛型技術。
關鍵字:virtual
虛函數表:此表中,主要是一個類的虛函數的地址表,這張表解決了繼承、覆蓋的問題,保證其內容真實反映實際的情況。
在C++標准規格說明書中說到,編譯器需要保證虛函數表的指針在於對象實例中最前面的位置。(保證正確取到虛函數的偏移量)
如何訪問虛表?
class Base { public: virtual void fun1() { cout << "Base:fun1()" << endl; } virtual void fun2() { cout << "Base:fun2()" << endl; } virtual void fun3() { cout << "Base:fun3()" << endl; } private: int x; }; typedef void (*pFun)(); void main() { Base b; cout <<hex<< *(int*)(&b) << endl; //獲得虛表指針 pFun fun = (pFun)*(((int*)*(int*)(&b))+1); //獲得虛表中函數的地址 fun(); }
解釋:根據前面知識,我們得到類實例所占空間的前四個字節空間為虛表地址。故__vfptr = *(int*)(&b)表示虛表的地址;然后在虛表的結構中,每個函數的地址也占用四個字節空間。
故Base:a() =*(((int*)(*(int*)(&b)))+0);