驗證virtual函式的原理

鴨脖發表於2013-04-25
#include <iostream>
using namespace std;


class Base{
public:
virtual void f() { cout << "the first virtual function f" << endl; }
virtual void g() { cout << "the second virtual function g" << endl; }
virtual void h() { cout << "the third virtual function h" << endl; }

};


#include "Base.h"
#include <iostream>
using namespace std;


typedef void(*Fun)(void);//Fun在這裡被定義為一種型別,這個型別可以描述為:指向引數為void,返回值也是void的函式的一個指標


int main(){
Base b;
Fun pFun = NULL;
cout<<"vtable address:"<<(int*)(&b)<<endl;//這裡說的vtable是一個指標,即指向陣列的指標 int**
cout<<"first virtual function address is"<<(int*)*(int*)(&b)<<endl;
// Invoke the first virtual function
int* vtable = (int*)*(int*)(&b);//int* 標誌著vtable陣列的開始
pFun = (Fun)*(vtable);
pFun();
cout<<"second virtual function address is"<<(vtable+1)<<endl;
pFun = (Fun)*(vtable+1);
pFun();
cout<<"third virtual function address is"<<(vtable+2)<<endl;
pFun = (Fun)*(vtable+2);
pFun();
}


這裡的驗證方法是,如果地址不是虛擬函式的地址,那麼用函式指標呼叫的時候,程式會崩潰,如果沒有崩潰得到正確的結果那說明你的運算時正確的。

相關文章