原理:如果基类包含虚函数,则派生类的对象都会有一个虚函数表指针,而且这个指针通常都是处于对象的最前面,即对象的地址和虚函数表指针的地址是一样的。
#include <iostream>
using namespace std;
class Base
{
private:
virtual void f0() { cout << "Base::f0()...." << endl; }
virtual void f1() { cout << "Base::f1()...." << endl; }
virtual void f2() { cout << "Base::f2()...." << endl; }
};
class Derive : public Base{};
typedef void(*Fun)(void);
int main(int argc, char* argv[])
{
Derive d;
Fun pFun0 = (Fun)*((int*)*(int*)(&d)+0);
Fun pFun1 = (Fun)*((int*)*(int*)(&d)+1);
Fun pFun2 = (Fun)*((int*)*(int*)(&d)+2);
pFun0();
pFun1();
pFun2();
return 0;
}
/*
Output:
Base::f0()....
Base::f1()....
Base::f2()....
*/