對虛函數、虛表的認識


虛函數:實現多態的機制,多態就是用父類型的指針指向其子類的實例,然后通過父類的指針調用實際子類的成員函數。讓父類的指針有“多種形態”,一種泛型技術。

關鍵字: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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM