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

C++ 多继承详情介绍

C++支持多继承,即允许一个类同时继承多个类。

关于多继承,一直以来争议不断,有一部分人认为多继承会带来大量的问题,为了解决这些问题会使得语言本身变得非常复杂,因此应当避免。另外一派认为多继承在某些场景下可以起到非常关键的作用,应当予以支持。

关于多重继承是好是坏,这是一个非常复杂的问题,网上历来争议不断。因此不过多阐述,感兴趣的同学可以查阅一下相关资料。仅仅从实际支持来看,目前市面上大部分的语言包括Java仅支持单继承,只有C++等少数语言支持多继承。这和C++的理念也有关,即认定不能通过减少语言特性来增强语言的表达力。

看完争议之后,我们来看看究竟什么是多继承呢?

我们来看一段代码案例:

1

2

3

4

5

6

7

8

9

10

11

classA{

public:

voidfuncA();

};

classB{

private:

boolfuncB()const;

};

classC:publicA,publicB{ ... };

在这段代码当中我们定义了两个类A和B,然后我们创建了一个类C,同时继承了A和B。这就是多继承,这里要注意一点,我们必须用关键字public来限定每一个基类,否则的话编译器会默认这是一个私有继承。

如果我们稍微修改一下代码,就会出现一些问题,比如:

1

2

3

4

5

6

7

8

9

10

11

classA{

public:

voidfunc();

};

classB{

private:

boolfunc()const;

};

classC:publicA,publicB{ ... };

在上面这个例子当中A和B都包含了函数func,在下面的执行语句当中会报错。

1

2

C c;

c.func();

虽然B中的func函数是私有的,但对于编译器来说依然是有歧义的。如果想要消除歧义,我们可以这样调用c.A::func()。

当多继承的父类拥有更高的继承层级的时候,可能会出现更复杂的问题,比如多继承菱形。也就是多个类之间的继承关系构成了一个抽象意义上的菱形,

比如我们参考一下C++ Primer中的例子:

在上面这张图当中,SingerWaiter都继承了Worker,而SingingWaiter同时继承了Singer和Waiter。从图上来看,这似乎没什么问题,但在实现上问题不少。

比如说,对于SingingWaiter类来说,它当中包含了多少Worker呢?

答案是有两个,从Singer这边继承了一个Worker,从Waiter又继承了一个Worker。

那么我们这样写就会出现问题:

1

2

SingingWaiter sw;

Worker *p = &sw;

通常这种赋值的时候,会将基类指针设置成派生类中基类对象的地址,但由于sw对象当中包含两个Worker对象,有两个地址,所以也会导致歧义。

我们可以使用强制转换的方式消除歧义:

1

2

3

SingingWaiter sw;

Worker *p = (Singer*) &sw;

Worker *p = (Waiter*) &sw;

但显然这样的方法虽然能够解决问题,

到此这篇关于C++ 多继承详情介绍的文章就介绍到这了

http://www.jsqmd.com/news/1144346/

相关文章:

  • Unity RayFire 插件 4 种 Simulation Type 深度对比:从 Dynamic 到 Kinematic 的实战选择指南
  • 计算机毕设 MySQL 8.0 数据库设计避坑:3个常见范式错误与性能优化方案
  • APK Editor Studio:基于C++/Qt的跨平台APK逆向工程自动化工具解决方案
  • 影刀RPA Excel与CSV互转的编码陷阱:中文不乱码的正确转换
  • 工业负载控制方案:TPD2015FN与PIC18F45K22应用解析
  • 工业信号隔离与抗干扰设计实战
  • MySQL EXISTS 子查询优化:5 个常见低效写法与改写方案
  • Windows Server 2022 防火墙高级配置:组策略批量部署 3 类规则
  • MyBatis 批量操作深度优化——从 N+1 到批处理的全路径
  • 国家中小学智慧教育平台电子课本下载工具:三步解决教育资源获取难题
  • 扩散模型图像恢复实战:基于RDBM的5种天气退化处理,PSNR平均提升1.55dB
  • Bilibili视频下载器:技术架构与4K高清下载完整指南
  • Hyper-V 虚拟机配置优化:Win7 分配 4GB 内存与 40GB 硬盘的实测性能对比
  • ZooKeeper 3.9.5 集群部署实战:3节点Docker Compose配置与Leader选举验证
  • QQScreenShot独立版终极指南:5分钟掌握免登录专业截图工具
  • CSS 多级菜单性能对比:Flexbox vs Grid vs Float 3 种布局方案实测
  • VMware ESXi 7.0 与 8.0 安装对比:5个关键配置差异与升级决策
  • 逻辑漏洞实战指南:从业务理解到漏洞挖掘的完整框架
  • ByteHouse:云原生数据仓库的架构解析与最佳实践
  • BetterNCM安装器:高效管理网易云插件的最佳选择
  • CentOS 8 镜像源失效排查:3步定位与阿里云/清华源切换方案
  • Win10 Hyper-V 安装 Win7 虚拟机:3 个常见报错(如无 Hyper-V 选项)的排查与解决
  • PHP 反序列化字符逃逸:filter函数替换导致长度变化的3种攻击场景分析
  • MySQL 条件汇总进阶:5 个复杂报表场景的 SUM(IF()) 与 GROUP BY 组合技巧
  • MySQL 8.0 数据清洗实战:3类异常值识别与 UPDATE/DELETE 批量处理
  • 全尺寸报告(Full Dimension Report)标准化编制与数字化指南
  • 微信小程序 globalData 监听:基于 Object.defineProperty 的 3 种实现方案对比
  • 7-Zip漏洞CVE-2024-38366:绕过Windows安全标记的压缩包攻击解析
  • Windows 11 22H2 双显卡排错指南:5步解决程序错误调用集显问题
  • Docker CE 24.0 在 CentOS 7/8 的 5 步安装与 3 步卸载完整流程