C++:虚继承中对象模型分析

本文探讨了C++中的虚继承问题,包括多继承导致的内存浪费和二义性,并介绍了虚继承的解决方案。通过VS开发工具分析类的对象模型,展示了虚继承如何优化内存布局,减少数据冗余。尽管虚继承解决了问题,但建议在实际开发中避免过多使用多继承,以降低复杂性和提高可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们知道 在多继承中,特别是 菱形继承中,会有两个问题:

  1. 内存的浪费。
  2. 二义性。
    所以 引进了虚继承来 解决问题,虚继承和虚函数的原理很类似。 虚继承有 vbptr(虚基类指针) 指向 vbtable(虚基类表)。 那底层到底如何实现,我们 从 类的对象模型来分析。
    在这里插入图片描述

对象模型分析

工具: vs 开发工具
在这里插入图片描述
命令: cl /d1reportSingleClassLayout[className] XXX.cpp

测试类
在这里插入图片描述我们来看 类Bb 和 Cc 是怎样的布局:
在这里插入图片描述

在这里插入图片描述

Cc 同理,我们就不演示了。

我们 看最终 Dd类的 类布局:
在这里插入图片描述
大小 为 两个指针 + 两个int = 16 和 预想是一样的。 现在 Dd 中只有一份 数据 _a 和 _b。 两个表 中 的数据 也正好是 对应指针到 _a和 _b 的偏移量。

总结

虽然 虚继承了解决了多继承带来的问题,但是我们在 实际开发中,还是尽量不用 多继承、其会让我们 整体变得 更加复杂,不可控。在java,python 都已经 没有多继承了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值