继承(下)【C++】

news2024/11/24 8:31:46

文章目录

  • 子类继承父类之后,子类的默认成员函数的变化
    • 构造函数
      • 编译器自动生成的构造函数
      • 程序员手动写的构造函数
    • 拷贝构造
      • 编译器自动生成的拷贝构造函数
      • 程序员手动写的拷贝构造函数
    • 赋值重载
      • 编译器自动生成的赋值重载
      • 程序员手动写的赋值重载
    • 析构函数
  • 继承与友元
  • 菱形继承
    • 什么是菱形继承?
    • 如何解决菱形继承?
    • 虚继承的原理
    • 菱形继承的使用建议【能不用就不用】

接上“集”【继承 (上)【C++】】

子类继承父类之后,子类的默认成员函数的变化

构造函数

编译器自动生成的构造函数

子类中的编译器自动生成的构造函数,会先子类构造函数的成员初始化列表中调用父类的默认构造函数即不需要传参数,就能调用的构造】,再完成子类自己的构造函数

在这里插入图片描述
如果父类没有默认构造,编译器自动生成的构造函数就会报错
此时需要我们手动写子类的构造函数,并在其成员初始化列表传参调用父类的构造


程序员手动写的构造函数

子类中,程序员手动写的构造函数,在我们自己没有在成员初始化列表中显式调用父类的构造的时候,编译器也会帮我们自动调用父类的默认构造


在这里插入图片描述
当然此时如果父类没有默认构造,就必须我们自己手动在成员初始化列表里传参调用了

在这里插入图片描述
在这里插入图片描述


拷贝构造

编译器自动生成的拷贝构造函数

子类中,编译器自动生成的拷贝构造函数,会先自动在子类的拷贝构造的成员初始化列表中调用父类的拷贝构造,再完成子类自己的拷贝构造
在这里插入图片描述


程序员手动写的拷贝构造函数

因为手动写了,所以编译器不会自动生成拷贝构造了,那么编译器就不会自动帮我们调用父类的拷贝构造了

在这里插入图片描述
所以
子类中,程序员手动写的拷贝构造函数必须由程序员自己手动在子类的拷贝构造的成员初始化列表中,传参调用父类的拷贝构造【此时传参,传子类的拷贝构造接收到的参数就行,因为继承(上)中提到的子类对象可以赋值给父类对象子类对象多出来的部分会“切割”掉


在这里插入图片描述


赋值重载

编译器自动生成的赋值重载

子类中,编译器自动生成的赋值重载函数,会先自动地调用父类的赋值重载,再完成子类自己的赋值重载


在这里插入图片描述


程序员手动写的赋值重载

因为手动写了,所以编译器不会自动生成赋值重载了,那么编译器就不会自动帮我们调用父类的赋值重载了

在这里插入图片描述
所以
子类中,程序员手动写的赋值重载必须由程序员自己手动在子类的赋值重载中

传参调用父类的赋值重载【此时传参,传子类的拷贝构造接收到的参数就行,因为继承(上)中提到的子类对象可以赋值给父类对象子类对象多出来的部分会“切割”掉


在这里插入图片描述
为什么在子类中调用父类的赋值重载必须要指定父类的类域呢?

这是因为,子类和父类的赋值重载同名了构成了隐藏,继承 (上)【C++】中就说过:
如果在子类里面调用构成隐藏的成员,不指定类域的话,就只会调用子类自己的成员

所以才必须指定父类的类域,这样才能调用到父类的赋值重载


析构函数

析构函数比较特殊,无论是编译器自动生成的析构还是程序员自己手动写的析构

子类的析构调用完成之后,都会再自动地调用父类析构


在这里插入图片描述
在这里插入图片描述


继承与友元

类和对象【六】友元和内部类中就提到过
友元关系是不能继承的也就是说父类友元不能访问子类私有和保护成员
可以形象的理解成妈妈的朋友不是我的朋友

在这里插入图片描述
但是也不是说我不能和她交朋友
在这里插入图片描述


菱形继承

什么是菱形继承?

举个例子
在这里插入图片描述

这样继承的话,D里面就会有两份A的成员,就会造成两个重大的问题:

  1. 数据冗余:即D类里面有两份A的成员,而且这两份完全重复,没有必要都存在
  2. 访问会有二义性:因为D类里面有两份A的成员,那么通过D类的对象访问A类的成员就不知道要访问这两份中的那一份

如何解决菱形继承?

使用虚继承可以解决菱形继承产生的问题【注意:不要在解决菱形继承以外的场景中使用虚继承
使用虚继承之后,D类中就只有一份A的成员了

虚继承的语法:
在会产生两份(多份)数据的根源的继承权限的前面加上virtual

上面那个例子就是在B和C继承A的时候,在B和C的继承权限前面加上关键字virtual即可
因为B和C继承A时,就是D中会产生两份A的数据的根源


虚继承的原理

继续使用之前的例子
①使用虚继承之前:
在这里插入图片描述

D类对象的组成如上图

D类里面,有两个父类的部分,一个从B那里继承来的(以下简称D中的B),一个从C那里继承来的(以下简称D中的C

他们里面都有类A的成员(即a)

②使用虚继承之后:

D类对象的组成如下图
在这里插入图片描述
也就是使用虚继承之后:
B类和C类的父类A的成员,会单独存在D类对象的最后,然后D类中的B和C就共享这公共的A

这个时候,D中的B和C原本存储A类的成员的地方就变成存储一个指针(称为虚基表指针
这个指针指向一张虚基表,虚基表里面存了偏移量

D对象中的B和C就可以通过各自的虚基表指针,找到各自的虚拟表
然后通过里面存储的偏移量找到D对象中存储的公共的A的成员


菱形继承的使用建议【能不用就不用】

现实编写代码的过程中,可以使用多继承,但是尽量不要产生菱形继承


菱形继承能不用就不用


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vm安装mac虚拟机

vm安装mac虚拟机 简介实操 简介 教程:完全面向萌新的黑苹果安装教学:黑苹果安装从入门到入白,借助VMware虚拟机给实体机硬盘按照macOS黑苹果系统 实操 下载unlocker,之后运行vm就可以新建mac虚拟机了 新建一个没有选择镜像的…

【Electron】桌面应用开发快速入门到打包Windows应用程序

electron 实现桌面应用开发快速入门到打包Windows应用程序 一、基本介绍 ‌‌Electron 是一个使用‌ JavaScript、‌HTML 和‌ CSS 构建桌面应用程序的框架。它通过将‌Chromium和‌Node.js嵌入到其二进制文件中,允许开发者使用JavaScript代码库创建跨平台的桌面应…

汽车冷却液温度传感器

1、冷却液温度传感器的功能 发动机冷却液温度传感器,也称为ECT,是帮助保护发动机,提高发动机工作效率以及帮助发动机稳定运行的非常重要的传感器之一。 发动机冷却液温度 (ECT) 传感器用于测量发动机的冷却液温度&…

IO进程线程 0822作业

作业 使用write和read完成文件的拷贝。 将1.txt文件内容拷贝到2.txt中 #include <myhead.h> int main(int argc, const char *argv[]) {if(argc ! 3){printf("外部传参错误\n");return -1;}int fd1;fd1 open(argv[1],O_RDONLY);if(fd1 -1){perror("op…

Java基础——自学习使用(static关键字)

一、static关键字是什么&#xff1f; static修饰的代码属于类&#xff0c;定义的变量存储在方法区的静态常量池当中 二、static可以修饰什么 1.static修饰变量 static修饰的变量叫做类变量&#xff0c;被所有该类产生的对象所共享&#xff0c;存储在方法区的静态常量池中 2…

Java巅峰之路---进阶篇---面向对象(二)

Java巅峰之路---进阶篇---面向对象&#xff08;二&#xff09; 多态介绍多态调用成员的特点多态的优势、弊端以及解决方案综合练习 包和final包的介绍使用其他类的规则&#xff08;导包&#xff09;final关键字final的用途常量 权限修饰符和代码块权限修饰符的介绍四个权限修饰…

给跨行或同行转岗产品经理的几点建议

转岗不但要勇气还需要方法。现在&#xff0c;从其他职位转岗成为产品经理并不罕见。交互设计师&#xff0c;UI设计师&#xff0c;测试&#xff0c;开发&#xff0c;运营和用户研究都有大量转岗到产品经理的事例&#xff0c;甚至还有客户服务&#xff0c;销售转岗产品的。 一方面…

关于智能编码助手【通义灵码】,开发者们这么说...

自通义灵码发布以来&#xff0c;不停地有开发者朋友为我们送上通义灵码的测评反馈。 关于通义灵码&#xff0c;开发者这样说 墨问西东 CEO 池建强&墨问研发团队 “通义灵码有一个强大的功能就是企业知识库检索增强&#xff0c;我们只需要上传团队的代码规范&#xff0c;…

TS之 对象可能为“未定义”,不能将类型“ XXXX | undefined “分配给类型{ xxxx }

1、Vue3 结合 TS 获取 HTMLElement 时报“未定义” 简单粗暴的处理就是在后面加一个【 ! 】感叹号&#xff0c;告诉 TS 引擎此元素存在&#xff0c;有点类似于 as xxx 的意思&#xff01; 2、使用声明的可选属性时&#xff0c;报“未定义” 使用 TS 我们经常会声明一些泛型&a…

AI学习记录 - 如何快速构造一个简单的token词汇表

创作不易&#xff0c;有用的话点个赞 先直接贴代码&#xff0c;我们再慢慢分析&#xff0c;代码来自openai的图像分类模型的一小段 def bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe c…

clip-path实现图片边角的裁剪

img {clip-path: polygon(0 7px,7px 0,calc(100% - 20px) 0,100% 20px,100% 100%,16px 100%,0 calc(100% - 16px));}每一个逗号隔开的就是路径坐标 左上角的两个点 0 7px &#xff0c;7px 0 右上角 calc(100% - 20px) 0,100% 20px 相当于通过这些点练成的线的圈起来的部分就是剩…

SpringBoot集成AI服务

背景 在当今这个日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;正以雷霆万钧之势席卷全球&#xff0c;从学术研究到商业应用&#xff0c;从日常生活到社会管理&#xff0c;无一不在经历着AI革命的洗礼。AI技术的飞速发展&#xff0c;不仅改变了我们的生活方式&…

数据库E-R 图

基础概念 E-R图 (Entity Relationship Diagram)&#xff0c;也称实体关系图。提供了表示实体类型、属性和联系的方法&#xff0c;用来描述现实世界的概念模型。其中各个实体&#xff08;数据模型中的对象&#xff09;可以有属性。 图形含义 1、实体 实体就是现实中存在的东…

博客园-awescnb插件-geek皮肤优化--公众号卡片

简介 博客园-awescnb插件-geek皮肤暂不支持配置展示公众号二维码&#xff0c;此文章目的使用手动注入方式自定义实现公众号卡片效果 效果展示 公众号卡片 动态效果 鼠标移入前为公众号指引页 鼠标移入后显示公众号二维码 切换动画为动态反转 首页展示 实现 在博客日历元…

ES存量数据迁移优化措施

在将存量数据迁移到 Elasticsearch (ES) 时&#xff0c;可以采取多种优化措施&#xff0c;以提高迁移效率、减少对来源系统和目标系统的影响&#xff0c;并确保数据的完整性。以下是一些建议和优化措施&#xff1a; 1. 批量操作 使用 Bulk API&#xff1a;Elasticsearch 提供…

Linux虚拟机磁盘管理-新分区磁盘挂载

挂载mount 注意&#xff1a;挂载前一定要对磁盘进行文件系统创建&#xff0c;否则无法挂载磁盘 比如mkfs.ext4系统文件 磁盘挂载前和挂载后&#xff1a; linux系统重启后磁盘挂载没有了怎么办(不建议&#xff0c;哪怕输错一个字系统起不来&#xff0c;自己操作的时候出现过起不…

Flat Ads:全球金融应用的营销投放洞察

随着移动互联网的普及,金融应用在全球范围内迅速崛起。无论是移动银行、支付服务,还是理财工具,金融类应用已经成为现代生活中不可或缺的一部分。根据最新的行业报告,全球金融应用的下载量和用户活跃度在过去几年里持续增长,尤其是在新兴市场,用户对数字金融服务的需求不断攀升…

远程供水无障碍,管线车助力全面消防防护_鼎跃安全

夏季是各类自然灾害的高发季节&#xff0c;其中森林火灾尤为频繁。这一时期的气候特征是干旱少雨&#xff0c;伴随着高温和强风&#xff0c;使得森林火灾的发生频率大幅增加。由于夏季空气湿度低&#xff0c;植被含水量减少&#xff0c;一旦出现火源&#xff0c;火势极易蔓延。…

Win11搭建Angular开发环境

作为一名后端程序员&#xff0c;无论当前的工作是否需要&#xff0c;会一点点前端无疑对自己是有帮助的。今天就来介绍一下如何搭建Angular的开发环境。我也是摸着石头过河&#xff0c;所以很多东西也不熟悉&#xff0c;先按照Angular官网的介绍来配置吧。 这个是Angular最新版…

科技在日常生活中的革新

在科技日新月异的今天&#xff0c;‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备&#xff0c;‌科技已经渗透到我们生活的每一个角落&#xff0c;‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现&#xff0c;‌无疑是科技改变生活的典…