虚表指针、虚函数指针位置

一图以镇之 

 下面开始试验

class A{
public:
    virtual void a() {};
};
class B{
public:
    virtual int b(){return 3;}
};
class C : public A,B{
public:
    virtual int c(){return 4;}
};

 首先定义三个类,C继承A和B,那么根据经验,C中会有一个指向A和B的虚表指针,如此我们分别打印sizeof(...)可以得到8 8 16的结果

那么C中自己也是有一个自己的虚函数的,C中的虚函数指针放哪里了呢,答案就是C中的虚函数指针放到了指向A虚表的指针内容的后面

也就是说C中两个虚表指针*a *b

*a中存放的是A中虚函数指针和C的虚函数指针

*b存放的是b的虚函数指针

A a;B b;C c;
// *(int64_t*)取值操作
// &a就是a的地址
// *(int64_t*)&a 取a实例内存里的值,即a的虚表指针
// *(int64_t*)(*(int64_t*)&a) 取a的虚表指针指向的值,即虚函数指针

cout<<(*(int64_t*)(*(int64_t*)(&a)))<<endl;
cout<<(*(int64_t*)(*(int64_t*)(&b)))<<endl;
cout<<(*(int64_t*)(*((int64_t*)(&c)+1)))<<endl;

上面的结果为打印虚函数指针,由于c中有两个指针,第二个指针指向b的表,所以下面两行输出相同。如果没有+1,则和第一行第三行输出相同。 

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值