C++学习笔记(4)-虚继承

1.虚继承

C++支持多继承,但当出现菱形继承时,可能会有数据冗余。

例如,类B,C都继承于A,那么类B,C中都包含A的成员变量,当有一个类D继承于B,C时,类D会包含B,C的成员变量,相应的便会有两份A的成员变量。为了解决这个问题,可以使用虚继承。

虚继承只需要在继承时声名virtual即可。

2.虚继承的内存分布

虚继承时,子类内存分布如下:

--虚基类表--------

--自身虚函数表--

--自身成员变量--

--基类虚函数表--

--基类成员变量--

父类不再是放在起始位置,而是以一个虚基类表指针代替,虚继承的父类追加在末尾。

虚基类表内存的是父类内存的偏移,即根据子类对象起始地址加多少偏移可以找到对于的父类虚表(或父类第一个成员变量,父类无虚表的情况)。

这样,上述菱形继承时,如果B,C均虚继承A,那么D中只会保留一个A的区域,B,C中分别保存对于虚基类表地址,从而可以根据B,C类对象指针加上查表得到的偏移找到对应的A类成员地址,如果A类有自己的虚函数的话,也可以通过这个方法找到对应的虚函数表,从而调用对应虚函数。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值