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

C++,菱形继承和虚继承

一、菱形继承的基本概念

        菱形继承又称为钻石继承,由公共基类派生出多个中间子类,又由多个中间子类共同派生出汇聚子类。汇聚子类会得到,中间子类从公共基类继承下来的多份成员。

菱形继承的格式:

                 A       --------公共基类/    \B      C    ------- 中间子类\    /D       --------汇聚子类

示例:

 

#include <iostream>
using namespace std;//封装公共基类 家具 类
class Jiaju
{
private:string color;
public://无参构造Jiaju() {cout << "家具的无参构造函数" << endl;}//有参构造Jiaju(string n):color(n){cout << "家具的有参构造函数" << endl;}
};//中间子类
//封装 沙发的类
class Sofa:public Jiaju
{
private:string sitting;
public://无参构造Sofa() {cout << "沙发的无参构造" << endl;}//有参构造函数Sofa(string s,string c):Jiaju(c),sitting(s){cout << "沙发的有参构造" << endl;}void display(){cout << sitting << endl;}
};//中间子类
//封装 床 类
class Bed:public Jiaju
{
private:string sleep;public://无参Bed() {cout << "床的无参构造" << endl;}//有参Bed(string s,string c):Jiaju(c),sleep(s){cout << "床的有参构造" << endl;}void display(){cout << sleep << endl;}
};//汇聚子类
//封装 沙发床类  继承于沙发 和 床
class Sofa_Bed:public Bed,public Sofa
{
private:int w;
public://Sofa_Bed(){cout << "沙发床的无参构造" << endl;}//有参构造Sofa_Bed(string sit, string s, int w,string c):Bed(s,c),Sofa(sit,c),w(w){cout << "沙发床的有参构造" << endl;}
};int main()
{
//    Sofa_Bed s;Sofa_Bed s1("可坐","可躺",123,"pink");return 0;
}

菱形继承存在的问题:

        汇聚子类会得到,中间子类从公共基类继承下来的多份成员,造成空间浪费,没有必要,还会对公共基类的成员多次初始化,或释放。

二、虚继承

 虚继承的作用:

        可以让汇聚子类只保留一份 中间子类从公共基类继承下来的成员。       

 虚继承的格式:

        在中间子类的继承方式前 加上 virtual

class 类名 : virtual 继承方式 类名   //中间子类
{中间子类的拓展;
};

使用虚继承的注意事项: 

        中间子类虚继承公共基类后,汇聚子类的初始化列表,先调用中间子类的有参构造函数,中间子类再调用公共基类的有参构造函数。但是,虚继承之后,只保留一份中间子类从公共基类继承下来的有参构造函数,意味着不知道调用哪一个中间子类继承下来的公共基类的构造函数,这样就会默认调用公共基类的无参构造函数。

        如果汇聚子类想要对公共基类的数据成员初始化,需要显性调用公共基类的构造函数。

示例: 

#include <iostream>
using namespace std;//封装公共基类 家具 类
class Jiaju
{
private:string color;
public://无参构造Jiaju() {cout << "家具的无参构造函数" << endl;}//有参构造Jiaju(string n):color(n){cout << "家具的有参构造函数" << endl;}
};//中间子类
//封装 沙发的类
class Sofa:virtual public Jiaju  //中间子类虚继承公共基类
{
private:string sitting;
public://无参构造Sofa() {cout << "沙发的无参构造" << endl;}//有参构造函数Sofa(string s,string c):Jiaju(c),sitting(s){cout << "沙发的有参构造" << endl;}void display(){cout << sitting << endl;}
};//中间子类
//封装 床 类
class Bed:virtual public Jiaju  //中间子类虚继承公共基类
{
private:string sleep;public://无参Bed() {cout << "床的无参构造" << endl;}//有参Bed(string s,string c):Jiaju(c),sleep(s){cout << "床的有参构造" << endl;}void display(){cout << sleep << endl;}
};//汇聚子类
//封装 沙发床类  继承于沙发 和 床
class Sofa_Bed:public Bed,public Sofa
{
private:int w;
public://Sofa_Bed(){cout << "沙发床的无参构造" << endl;}//有参构造Sofa_Bed(string sit, string s, int w,string c):Jiaju(c),Bed(s,c),Sofa(sit,c),w(w) //需要在汇聚子类中显性调用公共基类的有参构造函数{cout << "沙发床的有参构造" << endl;}
};int main()
{
//    Sofa_Bed s;Sofa_Bed s1("可坐","可躺",123,"pink");return 0;
}

http://www.lryc.cn/news/153146.html

相关文章:

  • js实现一行半文本的截取
  • 计算一个区间时间差值,时间保留剩下的差值
  • uniapp 微信小程序添加隐私保护指引
  • 行业追踪,2023-08-30
  • Redis——》Redis的部署方式对分布式锁的影响
  • VTK——使用包围盒切割医学图像
  • 在工具提示中使用自绘修改字体
  • 【Git管理工具】使用Docker部署GitLab服务器
  • 安装kali虚拟机镜像的坑
  • 【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部
  • 【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数
  • C语言--volatile
  • 技术深入解析与教程:网络安全技术探秘
  • Android studio 实现生成二维码和扫描二维码
  • Linux中7种文件类型
  • 基础算法--快速排序
  • 机器学习的第一节基本概念的相关学习
  • Python 之__name__的用法以及解释
  • 【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动
  • networkX-03-连通度、全局网络效率、局部网络效率、聚类系数计算
  • 【深入解读Redis系列】Redis系列(五):切片集群详解
  • 无涯教程-JavaScript - NORMDIST函数
  • 递归应用判断是否循环引用
  • 使用nginx-lua配置统一url自动跳转到hadoop-ha集群的active节点
  • AJAX学习笔记2发送Post请求
  • 产品团队的需求分析指南
  • Python算法——排序算法(冒泡、选择、插入、快速、堆排序、并归排序、希尔、计数、桶排序、基数排序)
  • [Linux]文件描述符(万字详解)
  • RenderTarget导出成图片,CineCamera相机
  • 深入探讨Java虚拟机(JVM):执行流程、内存管理和垃圾回收机制