class Test
{
public:
Test() : a(0) {}
virtual void print1() { cout <<"Test print1" << endl; }
virtual void print2() { cout <<"Test print2" << endl; }
private:
int a;
};
//测试vptr指针
//vptr指向了虚函数表,虚函数表里存放着类的所有虚函数的入口地址
int main()
{
Test t;
//得到vptr的值
//由于vptr指向的就是函数指针,因此其步长应该是4,所以可以用int*定义
int *vptr = NULL;
//vptr是虚函数类的第一个成员变量
memcpy(&vptr, &t, 4);
printf("vprt=%d\n", vptr);
typedef void (*pFunc)();
//通过vptr得到虚函数的入口地址,然后转化成函数指针
pFunc p1 = (pFunc)*vptr; //vptr指向了虚函数表,也即第一个虚函数的入口地址
p1();
pFunc p2 = (pFunc)*(vptr + 1); //指向第二个虚函数
p2();
return 0;
}