news 2026/5/16 7:36:32

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/5/13 2:51:16

Notion创始人介绍:Ivan Zhao(赵伊万)

核心创始人 Notion 是一款广受欢迎的一体化协作与生产力工具&#xff0c;其开发与运营主体为 Notion Labs, Inc.&#xff08;现更名为 Notion Software, Inc.&#xff09;。 核心创始人&#xff1a;Ivan Zhao&#xff08;赵伊万&#xff09; 身份&#xff1a;Notion 联合创始人…

作者头像 李华
网站建设 2026/5/11 9:47:31

Week 36: 量子深度学习入门:辛量子神经网络与物理守恒

文章目录Week 36: 量子深度学习入门&#xff1a;辛量子神经网络与物理守恒摘要Abstract1. 理论背景1.1 哈密顿动力学回顾1.2 量子系统中的辛结构2. SQNN的核心架构2.1 辛量子门 (Symplectic Gates)2.2 离散 Qubit 系统的 SQNN2.3 代码实现 (Continuous Variable)2.4 优势分析总…

作者头像 李华
网站建设 2026/5/14 3:25:35

MC ε-Greedy 算法详解

MC ε-Greedy 算法详解 🎯 算法目标 寻找最优策略,是探索性初始(Exploring Starts)蒙特卡洛算法的推广版本。相比于严格要求每个状态-动作对都必须被选为初始的算法,本算法通过ε-Greedy策略保证了充分的探索。 📋 算法流程 1️⃣ 初始化阶段 初始化策略 π₀(a|s…

作者头像 李华
网站建设 2026/5/13 5:12:10

以太网终端主机常用的Command

1.使用ARP命令获取主机上所有活跃的IP和MAC地址&#xff0c;ARP全称是Adress Resolution Protocol。arp -a2.使用route命令获取主机上所有网关&#xff08;网关就是路由&#xff09;route print3.查询协议栈中所有active的套接字信息netstat -anoa 不仅显示正在通信的套接字&am…

作者头像 李华
网站建设 2026/5/12 23:08:31

企业级应用:Copilot在团队协作开发中的落地实践

企业级应用&#xff1a;Copilot在团队协作开发中的落地实践 关键词&#xff1a;AI代码助手、团队协作、开发效率、代码质量、企业级实践 摘要&#xff1a;本文从企业团队协作开发的真实痛点出发&#xff0c;结合GitHub Copilot等AI代码助手的核心能力&#xff0c;通过“故事引入…

作者头像 李华