1. 程式人生 > >虛擬函式表指標的詳細辨析

虛擬函式表指標的詳細辨析

在每個包含有虛擬函式的類的物件的最前面(是指這個物件記憶體佈局的最前面,至於為什麼是最前面,說來
話長,這裡就不說了,主要是考慮到效率問題)都有一個稱之為虛擬函式指標(vptr)的東西指向虛擬函式表(vtbl)
,這個虛擬函式表(這裡僅討論最簡單的單一繼承的情況,若果是多重繼承,可能存在多個虛擬函式表)裡面存放了
這個類裡面所有虛擬函式的指標,當我們要呼叫裡面的函式時通過查詢這個虛擬函式表來找到對應的虛擬函式,這就
是虛擬函式的實現原理。這裡我假設大家都瞭解了,如果不瞭解可以去查下資料。好了,既然我們知道了虛擬函式
的實現原理,虛擬函式指標vptr指向虛擬函式表vtbl,而且vptr又在物件的最前面,那麼我們很容易可以得到虛函
下面是一個關於虛擬函式表指標的題目。
classTest{
public:
    inta;
    intb;
    virtualvoid fun() {}
    Test(inttemp1 = 0, inttemp2 = 0)
    {
        a=temp1 ;
        b=temp2 ;
    }
    intgetA()
    {
        returna;
    }
    intgetB()
    {
        returnb;
    }
};
 
intmain()
{
    Test obj(5, 10);
    // Changing a and b
    int* pInt = (int*)&obj;
    *(pInt+0) = 100;//改變的是虛擬函式表指標變數的值
    *(pInt+1) = 200;//改變的按成員宣告順序處在首位置的成員的值 
    cout << "a = " << obj.getA() << endl;
    cout << "b = " << obj.getB() << endl;
    return0;
}