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

C++中的多重继承和虚继承:横向继承、纵向继承和联合继承;虚继承

多重继承

A.横向多重继承:

在这里插入图片描述

B.纵向多重继承:

在这里插入图片描述

C.联合多重继承:

在这里插入图片描述

因为 single 和 waiter 都继承了一个 worker 组件,因此 SingingWaiter 将包含两个 worker 组件,那么将派生类对象的地址赋给基类指针将出现二义性

那么如何解决二义性问题呢?我们知道程序的执行一定是具有确定性的,在上述情况下,我们能想到的是进行强制转换,如下所示:
在这里插入图片描述
很显然,上述这种强制转换确实能够解决因联合继承带来的二义性问题,但是每次都进行这样的强制转换过于繁琐,那么有没有简单的办法解决二义性问题呢?答案就是:虚继承,所谓的虚继承,就是让共享一个祖父类

虚继承

A.What(什么是虚继承、虚基类)

  • 虚继承:

class Derived: public virtual Base, 如下例所示,展示了虚继承的形式

在这里插入图片描述

  • 虚基类

被声明为虚继承的基类被称为虚基类

B.Why(虚继承的作用)

  • 解决二义性冲突:当基类的指针指向孙子类的指针或引用时,会出现二义性,因为 孙子类对象包含多个祖父类对象,而虚继承只保留一个共享的祖父类
  • 减少内存消耗:因为孙子类只包含一个祖父类对象
  • 减少代码冗余:虚基类的成员只需在最终的派生类中定义一次

C.How

在这里插入图片描述

相关文章:

  • 后端工作之一:CrapApi —— API接口管理系统部署
  • 【服务器】在Linux查看运行的Python程序,并找到特定的Python程序
  • HW期间——应急响应
  • 什么是边缘计算?创造一个更快、更智慧、更互联的世界
  • Selenium 等待
  • 图像类别生成数字标签
  • C++基础篇(1)
  • 在ROS (Robot Operating System) 中,查看话题(topics)
  • 从0构建一款appium-inspector工具
  • aop的几种动态代理以及简单案例(1)
  • nginx配置ssl证书
  • JavaWeb__正则表达式
  • 27. 738.单调递增的数字,968.监控二叉树,贪心算法总结
  • 访问控制列表
  • linux 常用和不那么常用命令记录02 磁盘占用
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 4. 路由到控制器 - Laravel从零开始教程
  • 77. Combinations
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java Agent 学习笔记
  • Javascript基础之Array数组API
  • Js基础——数据类型之Null和Undefined
  • js中forEach回调同异步问题
  • Linux快速复制或删除大量小文件
  • nodejs:开发并发布一个nodejs包
  • Redis 中的布隆过滤器
  • ucore操作系统实验笔记 - 重新理解中断
  • uva 10370 Above Average
  • 分布式事物理论与实践
  • 前端设计模式
  • 使用API自动生成工具优化前端工作流
  • 我的zsh配置, 2019最新方案
  • 系统认识JavaScript正则表达式
  • Nginx实现动静分离
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (3)(3.5) 遥测无线电区域条例
  • (二)springcloud实战之config配置中心
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计大学生兼职系统
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)Google的Objective-C编码规范
  • (转)shell调试方法
  • (转)视频码率,帧率和分辨率的联系与区别
  • (转载)从 Java 代码到 Java 堆
  • .net wcf memory gates checking failed
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .pub是什么文件_Rust 模块和文件 - 「译」