今天看了hairetz转载的一篇关于虚函数表的文章,的确很好
http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
然后对其中的一些问题又重新复习了下,通过下面的代码来解释
class Base
{
public:
virtual void f()
{
cout << "Base::f" << endl;
}
virtual void g()
{
cout << "Base::g" << endl;
}
virtual void h()
{
cout << "Base::h" << endl;
}
};
typedef void(*Fun)(void);
int main()
{
Base b;
Fun pFun = NULL;
cout<<(int*)*(int*)(&b)<<endl<<endl; //虚函数表的首地址
//注意:虚函数表访问的时候,自己本身有个地址,然后他存储的也是地址(指向函数的地址)
cout<<endl;
cout<<(Fun)*((int*)*(int*)(&b)+0)<<endl; //虚函数表里存储的函数的地址
cout<<(Fun)*((int*)*(int*)(&b)+1)<<endl;
cout<<(Fun)*((int*)*(int*)(&b)+2)<<endl;
cout<<endl;
cout<<(int *)*((int*)*(int*)(&b)+0)<<endl;
cout<<(int *)*((int*)*(int*)(&b)+1)<<endl;
cout<<(int *)*((int*)*(int*)(&b)+2)<<endl;
cout <<endl;
cout <<(Fun)((int*)*(int*)(&b)+0) <<endl; // 虚函数表里自己本身的地址
cout <<(Fun)((int*)*(int*)(&b)+1) <<endl;
cout <<(Fun)((int*)*(int*)(&b)+2) <<endl;
cout <<endl;
cout <<(int *)((int*)*(int*)(&b)+0) <<endl;
cout <<(int *)((int*)*(int*)(&b)+1) <<endl;
cout <<(int *)((int*)*(int*)(&b)+2) <<endl;
return 0;
}
/*
0046F01C //虚函数表的首地址
0040122B //虚函数表里存储的函数的地址
004010AF
004012AD
0040122B
004010AF
004012AD
0046F01C //虚函数表里自己本身的地址
0046F020
0046F024
0046F01C
0046F020
0046F024
Press any key to continue
*/