当前位置: 首页 > news >正文

C++ 虚继承:破解菱形继承的“双亲困境”

1. 菱形继承与虚继承

C++ 是 支持多继承 的语言,允许一个类继承多个基类,该类可以同时拥有多个类的成员函数和成员变量。

多继承的优势在于更高的灵活性(允许构建更复杂的类层次结构),以及更强的代码复用性;同时带来了菱形继承问题

  • 菱形继承问题:当多个基类继承自同一个公共基类时,子类会包含多分基类实例。

D 类会包含两个 A 实例(一个来自 B,一个来自 C),造成二义性。解决方法是 使用虚继承 ,即在派生类继承基类时,使用 virtual 关键字声明基类:

class B : virtual public A {};
class C : virtual public A {};

虚基类 A 由最远派生类 D 构造,D 中只包含一个 A 实例,不再有二义性。

2. 虚继承的实现机制

虚继承的核心在于 虚基类指针虚基类表

  • 虚基类指针 vbptr :每个虚继承的 都会包含一个隐藏的 vbptr,指向虚基类表;

  • 虚基类表 vbtable :每个虚基类指针(vbptr)指向一个虚基类表。vbtable 存储了一系列偏移量(offset),通过偏移量可以准确定位虚基类的成员变量和函数。

如何观察 vbptr 和 vbtable 呢?

在 MSVC 中,

  1. 右键项目 -> 属性 -> C/C++ -> 命令行 -> 其他选项

  2. 添加 /d1reportAllClassLayout

/d1reportAllClassLayout

在这里插入图片描述

  1. 重新编译,输出窗口会显示详细的类内存布局。

在这里插入图片描述

http://www.xdnf.cn/news/1421317.html

相关文章:

  • 【macOS】垃圾箱中文件无法清理的--特殊方法
  • Linux | 走进网络世界:MAC、IP 与通信的那些事
  • PyTorch 实战(3)—— PyTorch vs. TensorFlow:深度学习框架的王者之争
  • mysql中如何解析某个字段是否是中文
  • 攻防演练笔记
  • Frida Hook API 转换/显示堆栈
  • 【数学建模学习笔记】缺失值处理
  • 数学分析原理答案——第七章 习题13
  • 文件夹上传 (UploadFolder)
  • crypto-babyrsa(2025YC行业赛)
  • 【系统架构师设计(8)】需求分析之 SysML系统建模语言:从软件工程到系统工程的跨越
  • 【机器学习学习笔记】numpy基础2
  • 基于 HTML、CSS 和 JavaScript 的智能图像边缘检测系统
  • ESB 走向黄昏,为什么未来属于 iPaaS?
  • 【第十一章】Python 队列全方位解析:从基础到实战
  • 计算机网络技术(四)完结
  • 9月1日
  • 8Lane V-by-One HS LVDS FMC Card
  • 【STM32】贪吃蛇 [阶段 8] 嵌入式游戏引擎通用框架设计
  • IO进程线程;标准io;文件IO;0901
  • OPENCV 基于旋转矩阵 旋转Point2f
  • Python核心技术开发指南(030)——函数入门
  • PAT乙级_1093 字符串A+B_Python_AC解法_含疑难点
  • 基于 C 语言的网络单词查询系统设计与实现(客户端 + 服务器端)
  • Python OpenCV图像处理与深度学习:Python OpenCV特征检测入门
  • AI时代SEO关键词实战解析
  • Python3环境搭建教程 - 使用Conda工具
  • CGroup 资源控制组 + Docker 网络模式
  • 【并发场景问题】超卖、一人一单业务问题的解决方案
  • 大型语言模型监督微调(SFT)