今天看了hairetz转载的一篇关于虚函数表的文章,的确很好 http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx 然后对其中的一些问题又重新复习了下,通过下面的代码来解释 #include<iostream> using namespace std; 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 */