news 2026/6/26 22:36:08

C++之多重继承

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++之多重继承

文章目录

  • 名字冲突
  • 钻石继承(菱形继承)与虚继承
  • C++允许一个类从一个或多个基类派生
  • 如果一个类只有一个基类,称为单一继承。如果一个类具有两个或两个以上的基类,就称为多重继承
class派生类名:继承方式 基类名1, 继承方式 基类名2...{};

#include<iostream>usingnamespacestd;classPhone{private:string m_number;public:Phone(conststring&number){m_number=number;}voidcall(conststring&number){cout<<m_number<<"打给: "<<number<<endl;}};classPlayer{public:Player(conststring&media){m_media=media;}voidplay(conststring&music){cout<<m_media<<"正在播放: "<<music<<endl;}private:string m_media;//播放器的名称};classComputer{private:string m_os;//使用的操作系统public:Computer(conststring&os):m_os(os){}voidrun(conststring&app){cout<<"在"<<m_os<<"正在运行: "<<app<<endl;}};/*典型的多重继承*/classSmartPhone:publicPhone,publicPlayer,publicComputer{public:SmartPhone(conststring&number,conststring&media,conststring&os):Phone(number),Player(media),Computer(os){}};intmain(void){SmartPhonehuawei("13988888888","MP4","鸿蒙");huawei.call("010-12345");huawei.play("我和我的祖国");huawei.run("王者荣耀");return0;}

名字冲突

  • 当两个不同基类拥有同名成员时,容易产生名字冲突问题
  • 使用域限定符解决
#include<iostream>usingnamespacestd;classA{public:voidfunc(void){cout<<"A::func()"<<endl;}};classB{public:voidfunc(void){cout<<"B::func()"<<endl;}};classC:publicA,publicB{};intmain(void){C test;test.A::func();return0;}

钻石继承(菱形继承)与虚继承

  • 钻石继承,一个派生类继承的多个基类又源自一个公共的祖先(公共基类)

#include<iostream>usingnamespacestd;classA{protected:intm_data;public:A(intdata){m_data=data;cout<<"A(int)"<<endl;}};classB:publicA{public:B(intdata):A(data){cout<<"B(int)"<<endl;}voidset(intdata){m_data=data;}};classC:publicA{public:C(intdata):A(data){cout<<"C(int)"<<endl;}intget(void){returnm_data;}};classD:publicB,publicC{public:D(intdata):B(data),C(data){cout<<"D(int)"<<endl;}};intmain(void){Dd(100);cout<<sizeof(d)<<endl;cout<<d.get()<<endl;// 100d.set(200);cout<<d.get()<<endl;//100return0;}
  • 以上set(200)后还是100
  • 解决方式:虚继承
  • 虚继承语法:
    • 在继承表使用virtual关键字修饰
    • 位于继承链末端子类负责构造公共基类子对象

#include<iostream>usingnamespacestd;classA{protected:intm_data;public:A(intdata){m_data=data;cout<<"A(int)"<<endl;}};classB:virtualpublicA{public:B(intdata):A(data){cout<<"B(int)"<<endl;}voidset(intdata){m_data=data;}};classC:virtualpublicA{public:C(intdata):A(data){cout<<"C(int)"<<endl;}intget(void){returnm_data;}};classD:publicB,publicC{public:D(intdata):B(data),C(data),A(data){cout<<"D(int)"<<endl;}};intmain(void){Dd(100);cout<<sizeof(d)<<endl;cout<<d.get()<<endl;// 100d.set(200);cout<<d.get()<<endl;//200return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 15:42:24

【YOLOv13多模态创新改进】联合Mamba创新首发| SCI 一区2025| 引入CMFM 跨模态特征融合Mamba模块,实现 RGB与红外等多模态特征的高效融合,含多种创新改进,顶会顶刊发文热点

一、本文介绍 🔥本文给大家介绍使用 CMFM 跨模态特征融合Mamba模块改进 YOLOv13 多模态融合目标检测框架,可在保持实时性的前提下实现高效稳定的跨模态特征融合,充分利用可见光与红外信息的互补优势,显著提升复杂环境下的检测鲁棒性。该模块基于 Mamba 状态空间模型进行…

作者头像 李华
网站建设 2026/6/26 15:37:00

sql语言之分组语句group by

在sql语言中&#xff0c;group by 是分组语言语法是select 表达式 from 表名 group by 分组字段比如说上图的数据表&#xff0c;这是部分截图&#xff0c;表名叫table_tom&#xff0c;假如要按city字段进行分组&#xff0c;计算score各字段总和select sum("score") a…

作者头像 李华
网站建设 2026/6/26 16:28:43

jsp蛋糕甜品店管理系统4fx6j--(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 用户,商品分类,商品尺寸,商品信息 开题报告内容 一、研究背景及意义 随着互联网的普及和消费者购物习惯的改变&…

作者头像 李华
网站建设 2026/6/26 16:31:29

PADS 多层板设计时怎么设置满足3W间距 或 不在某参考层布线

如何设置满足3W间距 在router中 右键选择网络 双击你要设置的网络 弹出 选择安全间距给这个网络添加一个特殊安全间距 比如其3w需10mil 我就 这样其与其他导线的安全距离就为10mil了 你布线时drc打开一不满足就会报错提示你 设置在参考层内不布线 如果你想要在哪个网络不…

作者头像 李华
网站建设 2026/6/26 16:32:48

省心绘制财务核算流程图零门槛操作画图超便捷高效

做财务工作的朋友&#xff0c;大概率都有过这样的困扰&#xff1a;领导让画一份财务核算流程图&#xff0c;自己要么不会用专业工具&#xff0c;要么工具操作太复杂&#xff0c;画一张图要耗费大半天时间&#xff1b;新手入门更是无从下手&#xff0c;对着空白画布不知道从何开…

作者头像 李华
网站建设 2026/6/25 17:11:49

博泰车联网智能座舱 Android 开发工程师的核心能力与实战挑战

博泰车联网科技(上海)股份有限公司 Android 应用开发工程师 职位信息 岗位职责: ① 参与需求分析,与产品、设计团队协同,精准把握智能座舱应用业务与用户需求; ② 开展性能优化,内化用户、CPU等关键指标,编写测试计划并执行多种测试,保障应用稳定; ③ 参与模块方案…

作者头像 李华