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

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;}
http://www.jsqmd.com/news/359481/

相关文章:

  • C++之继承与组合
  • 【YOLOv12多模态创新改进】联合Mamba创新首发| SCI 一区2025| 引入CMFM 跨模态特征融合Mamba模块,实现 RGB与红外等多模态特征的高效融合,含多种创新改进,顶会顶刊发文热点
  • 【YOLOv10多模态创新改进】全网独家复现创新 | TGRS 2025 | 引入MROD-YOLO的 MSIA多尺度迭代聚合模块,优化可见光与红外信息的特征交互融合、提升复杂环境中小目标检测效果
  • 【YOLOv12多模态创新改进】全网独家复现创新 | TGRS 2025 | 引入MROD-YOLO的 MSIA多尺度迭代聚合模块,优化可见光与红外信息的特征交互融合、提升复杂环境中小目标检测效果
  • Python快速入门(6)——for/if/while语句
  • 【YOLOv8多模态创新改进】独家创新改进首发 | SCI一区Top 2025 | 引入CIMFusion 跨模态交互特征融合模块,增强可见光和红外图像之间的特征交互,含多种创新改进,顶会顶刊发文热点
  • 2026年全球云石胶品牌王者有哪些!顶级防霉+环保合规企业盘点 - 品牌推荐2026
  • 电力设备厂商必看!变比测试仪专用屏四大优势:矢量图清晰显示、7-10天快速定制、源头直供价、三年质保 - 浴缸里的巡洋舰
  • go 中 GOMAXPROCS 详解
  • 自然语言处理 - f
  • GMSK调制解调系统的matlab性能仿真,对比维特比解调,1bit差分解调,2bit差分解调
  • 基于Spring Boot的绥大学生学习平台管理系统的设计与实现
  • OAuth是什么?
  • MC ε-Greedy 算法详解
  • 力扣1747-应该被禁止的Leetflex帐户 - 指南
  • APUE笔记:Process Environment(七) - Invinc
  • 401 Unauthorized from POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/gener
  • jsp蛋糕甜品店管理系统4fx6j--(程序+源码+数据库+调试部署+开发环境)
  • jsp代理会计企业信息管理系统b4072(程序+源码+数据库+调试部署+开发环境)
  • 在线制作物业管理制度流程图轻松上手无需专业绘图技巧
  • 【题解】Atcoder Beginner Contest 444(ABC444) A~E
  • SampSharp ECS 创建 PlayerTextDraw
  • jsp德育管理系统63rh0--程序+源码+数据库+调试部署+开发环境
  • Excel表格自适应大小设置方法 - 指南
  • 企业元宇宙布局中的AI数据存储:AI应用架构师的5个选择策略
  • 详细介绍:Chromium 140 编译指南 macOS 篇:安装与配置 Xcode(二)
  • jsp党员信息管理系统76673--(程序+源码+数据库+调试部署+开发环境)
  • 给投放 google ads 广告的新手写的一些话
  • 机房管理难题终结者:U位系统解决资源闲置、故障排查慢等核心问题
  • 洛谷 P1368:工艺 ← 双指针 + 解环成链