虚继承,虚函数和虚指针之间的关系

来源自本人知乎回答

问题:

1.在一个虚继承的体系中,所有类都没有虚函数,那么这些类的对象模型中存不存在vptr?

2.在一个类的对象模型中,存在vptr的充要条件是什么?

3.A类的对象模型中有vptr__A,B类普通继承A类。B类需要满足什么条件,其对象模型中,除了含有vptr__A以外,还含有vptr__B?

4.A类的对象模型中有vptr__A,B类虚拟继承A类。B类需要满足什么条件,其对象模型中,除了含有vptr__A以外,还含有vptr__B?

回答:

最好明确一下,虚指针vptr指的什么,vptr常指的是vfptr,用于实现虚函数的功能,指向虚表,而还有一个vbptr,用于实现虚继承,指向一个偏移量表(vfptr与vbptr各占一个指针的内存,至少MSVC是这样的)。

正面回答一下

1,对大部分编译器,不存在vfptr,对于MSVC,存在vbptr

在这里插入图片描述
在这里插入图片描述

alignment member是内存对齐,面试又一个考点来了

2,对MSVC,存在虚函数则存在vfptr,存在虚继承则存在vbptr

在这里插入图片描述

在这里插入图片描述

3,恐怕派生类对象不会多出一个额外虚指针

4,对于MSVC,B对象既有vbptr,也有vfptr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值