news 2026/6/15 14:33:05

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/15 14:00:12

Python快速入门(6)——for/if/while语句

Python快速入门&#xff08;6&#xff09;——for/if/while语句Python的运算基本运算符常用数学运算For循环If条件While循环Python的运算 基本运算符 除了数字支持基本运算符外&#xff0c;python支持幂乘&#xff08;**&#xff09;&#xff0c;python的字符串、列表、元组都…

作者头像 李华
网站建设 2026/6/15 11:23:58

jsp党员信息管理系统76673--(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。系统程序文件列表用户,党费信息,培训公告,奖惩信息,参加活动,基层党组织,党委,党支部开题报告内容一、研究背景与意义随着信息化技术的…

作者头像 李华
网站建设 2026/6/15 11:24:10

PADS 扇孔设置 扇孔到BGA焊盘内部解决办法

在Router或layout中设置扇出一般按上面看这样设置&#xff0c;然后焊盘入口这一定不能勾选下面这个SMD布局上打孔&#xff0c;不然会导致扇孔到BGA焊盘内部然后选择BGA原件&#xff0c;右键点击扇出即可

作者头像 李华
网站建设 2026/6/15 12:18:48

简单制作公司固定资产管理图 新手画图也能快速上手

良功绘图网站 (https://www.lghuitu.com) 在企业日常运营中&#xff0c;固定资产管理是保障生产经营有序开展的重要工作&#xff0c;小到办公电脑、打印机&#xff0c;大到生产设备、厂房建筑&#xff0c;都属于固定资产的范畴。而固定资产管理图作为可视化的管理工具&#xf…

作者头像 李华
网站建设 2026/6/15 14:11:59

高效制作会计账务处理流程图 新手画图零门槛超省心

良功绘图网站 (https://www.lghuitu.com ) 在财务会计工作中&#xff0c;账务处理流程图是梳理工作流程、规范操作标准、提升团队协作效率的重要工具。一张清晰、规范的会计账务处理流程图&#xff0c;能让财务新人快速上手工作&#xff0c;让老员工梳理工作逻辑&#xff0c;还…

作者头像 李华