#include <cstdlib>
#include <iostream>
using namespace std;
class Base{
virtual void f1(){cout<<"Base::f1()"<<endl;};
virtual void f2(){cout<<"Base::f2()"<<endl;};
};
class Derived:public Base{
};
typedef void (*Fun)(void);
int main(int argc, char *argv[])
{
cout<<sizeof(Base)<<" "<<sizeof(Derived)<<endl;
Base b,b1;
Base *p=&b;
Derived d;
Fun pf,pf1;
pf=(Fun)*(int *)(*(int *)(&b));
pf1=(Fun)*((int *)(*(int *)(&b1))+1);
system("PAUSE");
pf();
pf1();
cout<<"对象b的内存首地址:"<<p<<endl;
cout<<"对象d的内存首地址:"<<&d<<endl;
cout<<"对象b1的内存首地址:"<<&b1<<endl;
cout<<"b虚函数表的地址:"<<(int *)(*(int *)(&b))<<endl;
cout<<"d虚函数表的地址:"<<(int *)(*(int *)(&d))<<endl;
cout<<"对象b1虚函数表的地址:"<<(int *)(*(int *)(&b1))<<endl;
cout<<"可以看出两个对象的虚函数表的地址相同"<<endl;
cout<<"第一个虚函数的地址:"<<(int *)(*(int *)(*(int *)(&b)))<<endl;
cout<<"第二个虚函数的地址:"<<(int *)(*((int *)(*(int *)(&b))+1))<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
运行后如下图:
结论:每一个对象实例,为其分配内存时,都有4个字节存放”虚函数表的地址“且对同一类型的每一个实例的4字节内存中的内容一样,包括派生类0x441d38。
虚函数表中保存的是每个虚函数的入口地址。