当前位置: 首页 > 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.dtcms.com/a/361987.html

相关文章:

  • 拆解期货交易所:清算交收体系!
  • 配置sscms时被sql server处处刁难
  • 从 Skip Take 到 Keyset:C# 分页原理与实践
  • 考研复习-计算机网络-第一章-计算机网络概述
  • Parasoft C/C++test解析:覆盖率与可追溯性的软件测试协同方案
  • 免费GIS服务器方案:OGC标准3DTiles服务发布与跨平台渲染实践
  • 安全等保复习笔记
  • flume接收处理器:构建高可用与高性能的数据链路
  • Python 人工智能深度学习系统学习(附视频教程)
  • PowerPoint和WPS演示如何在放映PPT时用鼠标划重点
  • C++ STL序列容器-------list
  • 无人设备遥控器之安全加密体系
  • 【收藏级】Windows AI 本地开发「完全体」环境搭建清单
  • 多校区学校押金原路退回系统之免安装使用教程——东方仙盟
  • 计算机三级嵌入式填空题——真题库(28)原题附答案速记
  • matlab-神经网络的语音识别
  • 神经网络2——使用Keras实现MLP
  • 深度学习中常用的激活函数
  • 玩转OurBMC第二十二期:OurBMC之PCIe接口应用(上)
  • Triton Linalg编译
  • 系统性学习数据结构-第二讲-顺序表与链表
  • K8S-etcd数据库的相关操作
  • DHT11-温湿度传感器
  • 基于单片机智能饮水机/智能热水壶
  • Redis 如何实现分布式锁,以及redis的适应场景分析
  • 【跨平台编译】【树莓派】在x86上编译树莓派上运行的CC++代码,搭建树莓派4B的跨平台编译环境
  • ccache编译加速配置
  • Meteor主题友链页面自研
  • Qt 的信号signal的参数是否会在内部被拷贝?
  • Vue3 中 Proxy 在组件封装中的妙用