天天看點

虛函數和虛指針

問題:

class a

{

protected:

virtual void test(){coutvirtual void test1(){cout};

問題1:

sizeof(a)=4,這個4應該是個指針大小,代表虛指針,但是如果這樣的話是不是應該有兩個指針呢?? 

問題2:

還有一個地方是 a aa; sizeof(aa)=4,那麼到底是虛指針是存在類裡面還是類的對象裡面呢?? 

問題3:

虛指針是個函數指針,指向虛函數表裡面的位置,那麼虛函數表是存在哪裡的呢??大小又是多少呢???從上面兩個例子好像看不到明确的答案,似乎類和對象都沒存放

解:

問題1: 

的确是個指針的大小,但是并不是指針虛函數,而是指向虛表,虛表裡存放的才是虛函數的指針.

問題2: 

類不是一個可以存貯東西的地方,類的概念隻存在于編譯期間,因為隻能存放在對象裡.

問題3: 

虛指針是個函數指針,指向虛函數表裡面的位置,那麼虛函數表是存在哪裡的呢??大小又是多少呢???從上面兩個例子好像看不到明确的答案,似乎類和對象都沒存放 

虛表是整個類共用的,他的大小取決于你定義的虛函數的個數,以及編譯器的政策.一般存在于記憶體的某個地方,你不需要去管他.

//用C來實作C++虛表機制

//理論可以用函數指針和結構體的語言都可以實作

//-------------------------------C++的對象建構,确定虛表結構-------------------------------

class IDispath

public:

    virtual  void __stdcall Find() = 0;

    virtual  void __stdcall Invoke(int x) = 0;

};

class ITest :public IDispath

    virtual  void __stdcall Use() = 0;

class CTest :public ITest

    void  __stdcall Find()

    {

        printf("Find\n");

    };

    void  __stdcall Invoke(int x)

    {   

        printf("Invoke(%d)\n",x);

    void __stdcall Use()

        printf("use\n");

//-------------------------------C 部分構造和C++對象相同的虛表結構-------------------------------

typedef struct STest STest;

struct vtpr//虛表内容

    void (__stdcall *Find)( STest* This);//虛表所對應的函數指針 第一個參數為對象的this指針

    void (__stdcall *Invoke)( STest* This,int x);

    void (__stdcall *Use)( STest* This);

struct STest

    struct vtpr * p;//虛表指針

int main(int argc, char* argv[])

    CTest* t =new CTest;

    //利用C建構的虛表進行函數調用

    STest* pTest = (STest*)t;

    pTest->p->Find(pTest);

    pTest->p->Invoke(pTest,23);

    pTest->p->Use(pTest);

    delete t;

    return 0;

}

《inside the c++ object model》

繼續閱讀