您的位置:首页 > 编程语言 > C语言/C++

C++ 多重继承 计算虚表指针及虚函数地址

2018-03-06 09:56 615 查看
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;
}
输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐