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

菱形继承 虚继承

菱形继承 虚继承

在c++中,在使用多继承时如果发生类A排石出类B和类C,类D继承自类B和类C,这是就发生菱形继承。

在这里插入图片描述

如果这时D调用A那编译器就发生了混乱,它不知道要用B中的A还是C中的A。

验证代码如下

//菱形继承
class A {protected:int m_a;
};
//直接基类B
class B : public A {protected:int m_B;
};
class C : public A {protected:int m_C;
};
class D : public B,public C {
public:void srtA(int A) {//错误的方式 m_a=A;//正确的方式——需要进行声明或者使用虚继承B::m_a=A;}void setB(int B) {m_B = B;}void setc(int c) {m_C = c;}void setD(int D) {m_D = D;}
private:
int m_D;
};

很好虽然用进行声明的方式可以解决,但是又会出现另一个问题,就是数据冗余,为了解决菱形继承出现的数据冗余的问题C++提出了虚继承,虚继承使得派生类中只保留一份间接成员

需要用到 virtual

语法

class B:virtual public A{};

我们把之前的代码改一改发现果然解决了问题


//菱形继承
class A {protected:int m_a;
};
//直接基类B
class B : virtual public A {protected:int m_B;
};//这里改了
class C : virtual public A {protected:int m_C;
};//这里改了
class D : public B,public C {
public:void srtA(int A) {m_a=A;}void setB(int B) {m_B = B;}void setc(int c) {m_C = c;}void setD(int D) {m_D = D;}
private:
int m_D;
};
int main() {D d;return 0;
}

虚继承构造函数

在序继承中,虚基类是由最终的派生类初始化的。

简单点说就是由最后一次子类初始化他才会改变。


#include <iostream>
#include <bits/ostream.tcc>
using namespace std;
//菱形继承
class A {protected:int m_a;
public:A(int a):m_a(a){}void print() {cout<<this->m_a<<endl;}
};
//直接基类B
class B : virtual public A {protected:int m_B;public:B(int a,int b):A(a),m_B(b){}void print() {cout<<this->m_a<<" "<<this->m_B<<endl;}
};
class C : virtual public A {protected:int m_C;
public:C(int a,int c):A(a),m_C(c){}void print() {cout<<this->m_a<<" "<<this->m_C<<endl;}
};
class D : public B,public C {
public:D(int a,int b,int c,int d):
A(a),B(90,b),C(100,c),m_D(d){}
//在这里虽然赋过90和100 但是这里赋值不作数void srtA(int A) {m_a=A;}void setB(int B) {m_B = B;}void setc(int c) {m_C = c;}void setD(int D) {m_D = D;}void print() {cout<<this->m_a<<" "<<this->m_B<<" "<<this->m_C<<" "<<this->m_D<<endl;}private:
int m_D;};
int main() {A a1(111);a1.print();B b1(222 ,333);b1.print();C c1(444 ,555);c1.print();D d1(666,777,888,999);d1.print();return 0;
}

这篇博客到这里就结束了喜欢记得点赞哦(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

http://www.xdnf.cn/news/15669.html

相关文章:

  • 快速安装GitLab指南
  • go安装使用gin 框架
  • web3 区块链技术与用
  • 【论文精读】基于共识的分布式量子分解算法用于考虑最优传输线切换的安全约束机组组合
  • Django母婴商城项目实践(五)- 数据模型的搭建
  • UniApp TabBar 用户头像方案:绕过原生限制的实践
  • Selenium 攻略:从元素操作到 WebDriver 实战
  • STM32之L298N电机驱动模块
  • 【iOS】MRC与ARC
  • Fish Speech:开源多语言语音合成的革命性突破
  • 伺服电机与步进电机要点详解
  • 专题:2025智能体研究报告|附70份报告PDF、原数据表汇总下载
  • 质变科技亮相可信数据库发展大会,参编《数据库发展研究报告2025》
  • Linux学习之认识Linux的基本指令
  • 前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战
  • 多模态大模型重构人机交互,全感官时代已来
  • 微服务项目总结
  • 短视频矩阵系统:选择与开发的全方位指南
  • Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
  • Java学习------使用Jemter测试若依项目自定义的功能
  • Unity 常见数据结构分析与实战展示 C#
  • APIs案例及知识点串讲(下)
  • CES Asia 2025备受瞩目,跨国企业锁定亚洲战略首发契机
  • 基于Ubuntu22.04源码安装配置RabbitVCS过程记录
  • ARM64高速缓存,内存属性及MAIR配置
  • 基于华为openEuler系统安装DailyNotes个人笔记管理工具
  • Java全栈面试实录:从Spring Boot到AI大模型的深度解析
  • Glary Utilities (PC维护百宝箱) v6.24.0.28 便携版
  • 云原生 DevOps 实战之Jenkins+Gitee+Harbor+Kubernetes 构建自动化部署体系
  • 密码学基础概念详解:从古典加密到现代密码体系