C++ 类的虚表位于类内存的开始位置
上代码:
class base{
public:
base(){};
~base(){};
private:
virtual void a(){printf("base a\n");}//特意设定为私有,通过虚函数表地址可以访问
public :
virtual void b(){printf("base b\n");}
virtual void c(){printf("base c\n");}
};
class base1{
public:
base1(){};
~base1(){};
public :
virtual void a(){printf("base1 a\n");}
virtual void b(){printf("base1 b\n");}
virtual void c(){printf("base1 c\n");}
};
class base2{
public:
base2(){};
~base2(){};
public :
virtual void a(){printf("base2 a\n");}
virtual void b(){printf("base2 b\n");}
virtual void c(){printf("base2 c\n");}
};
class Drive1 : public base ,public base1 , public base2{
virtual void c(){printf("Drive1 c\n");}
};
int main()
{
typedef void (*Fun)();
Drive1 ob;
int *vptr = (int *)(*((int *)(&ob)));
printf("第一个父类虚函数表的地址:0x%08X\n",vptr);
// printf("第一个虚函数的地址:0x%08X\n",vptr[0]);
// printf("第二个虚函数的地址:0x%08X\n",vptr[1]);
// printf("第三个虚函数的地址:0x%08X\n",vptr[2]);
Fun fff = (Fun)vptr[0];
fff();
fff = (Fun)vptr[1];
fff();
fff = (Fun)vptr[2];
fff();
vptr = (int *)(*((int*)(&ob)+1));
printf("第二个父类虚函数表的地址:0x%08X\n",vptr);
fff = (Fun)vptr[0];
fff();
fff = (Fun)vptr[1];
fff();
fff = (Fun)vptr[2];
fff();
vptr = (int *)(*((int*)(&ob)+2));
printf("第三个父类虚函数表的地址:0x%08X\n",vptr);
fff = (Fun)vptr[0];
fff();
fff = (Fun)vptr[1];
fff();
fff = (Fun)vptr[2];
fff();
system("pause");
return 0;
}
输出: