http://blog.csdn.net/haoel/article/details/1948051/
//虚函数表保存了虚函数的地址,虚函数表相当于一个指针数组
class Base
{
private://非公有虚函数同样会存在子类的虚函数表中
int num;
void real() {cout<<"Base::real"<<endl;}
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};
typedef void(*PFun)(void);
main
Base b;
PFun pFun = NULL;
cout << "虚函数表地址:" << &b<< endl;
cout << "虚函数表地址:" << (int*)(&b)<< endl;//同上
//虚函数表保存了虚函数的地址,所以以(int*)(&b)为地址的值即为虚函数地址
//虚函数表保存在类对象内存空间的第一个位置
//继承子类的实例中,同名虚函数会覆盖父类的虚函数在虚表中的位置,没有被覆盖的函数依旧,这样就实现了多态
cout << "以虚函数表地址为地址的值:" << *((int*)(&b))<< endl;//以(int*)(&b)为地址的值
cout << "---" << (int*)*(int*)(&b) << endl;//把值强转为int型地址
cout << "---" << (int*)*(int*)(&b)+1 << endl;//加4个字节
cout << "---" << (int*)*(int*)(&b)+2 << endl;//指针占4个字节
cout << "---" << (int*&)b<< endl;//同上
pFun = (PFun)*((int*)*(int*)(&b));//转化成指向函数的指针
pFun();//Base::f
pFun = (PFun)*((int*)*(int*)(&b)+1);
pFun();//Base::g
pFun = (PFun)*((int*)*(int*)(&b)+2);
pFun();//Base::h