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

继承(下)【C++】

文章目录

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

接上“集”【继承 (上)【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的成员


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

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


菱形继承能不用就不用


相关文章:

继承(下)【C++】

文章目录 子类继承父类之后,子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…...

AI模拟器

一、介绍 基于鸿蒙Next模拟一个ai对话过程二、场景需求 客户服务、数据分析、个性化推荐、图像和视频处理、智能家居、交通管理、教育行业、制造等等。 三、业务步骤 第一步:输入框提出问题,发送问题, 第二部:下次发送&#xff0…...

【C++二分查找 前缀和】1658. 将 x 减到 0 的最小操作数

本文涉及的基础知识点 C二分查找 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1658. 将 x 减到 0 的最小操作数 给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素&am…...

验证实战知识点--(2)

1.seq中的pre_start pre_start 是 uvm_sequence 类的一个虚拟方法,用于在序列开始执行之前进行初始化和设置。这个方法在调用 start 方法前立即执行,提供了一个执行自定义初始化代码的机会。 start 方法用于启动序列的执行,而 pre_start 可以…...

【图文并茂】ant design pro 如何优雅地把删除和批量删除功能合并到一起,并抽出来成为组件

如上图所示,其实批量删除和删除应该算是一个功能 只是删除一个或多个的区别 那么接口应该用的同一个 删除一个的时候呢,就传 一个对象_id 过去 删除多个的时候,就传 多个 对象 _id 的数组过去 后端 const deleteMultipleRoles handleAs…...

监控篇之利用dcgm-exporter监控GPU指标并集成grafana大盘

一、应用场景 当环境中包含GPU节点时,需要了解GPU应用使用节点GPU资源的情况,例如GPU利用率、显存使用量、GPU运行的温度、GPU的功率等。 在获取GPU监控指标后,用户可根据应用的GPU指标配置弹性伸缩策略,或者根据GPU指标设置告警…...

获取当前路由器的外网IP(WAN IP)

GPT-4o (OpenAI) 获取当前路由器的外网IP(WAN IP)可以通过以下几种方法: 1. 访问路由器管理页面: - 通常路由器的管理页面可以通过在浏览器中输入路由器的IP地址来访问(例如,192.168.0.1 或 192.168.1…...

QT Creator UI中文输入跳出英文

笔者用的是QQ拼音输入,发现只要在UI中加入了QTableWidget,输入多几次中文,就会跳入英文。 后面改用搜狗拼音稍微好一些,但是偶尔还是插入了空格。...

Java基础核心知识学习笔记

方法重载 请记住下面重载的条件 方法名称必须相同。参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)。方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。重载是发生在编译时的,因为编译器可以根…...

Leetcode 237.19.83.82 删除链表重复结点 C++实现

Leetcode 237. 删除链表中的节点 问题:有一个单链表的head,我们想删除它其中的一个节点node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点head。链表的所有值都是唯一的,并且保证给定的节点 node不是链表中的最后一个节点。删除…...

Spring OAuth2.0资源服务源码解析

主要分析spring-security-oauth2-resource-server的源码,介绍OAuth2.0授权码模式下Spring Boot OAuth2资源服务的运行流程,分析其是如何对令牌进行认证的,并展示资源服务配置 代码版本信息 Spring Boot 2.7.10 spring-security-oauth2-resou…...

JavaScript 原型与原型链

原型与原型链 要讨论原型与原型链,就要先了解什么是 构造函数 ,构造函数与普通函数没有太大的区别,使用 new关键字 创建实例对象的函数,就叫做构造函数。 在js中,每一个函数类型的数据都有一个 .prototype 的属性&am…...

Spring Boot实现简单的Oracle数据库操作

使用到的技术: 1. Spring Boot:用于简化Spring应用的开发。 2. Dynamic DataSource:实现动态多数据源的访问和切换 3. Oracle JDBC Driver:与Oracle数据库进行连接和交互。 4. Mybatis-Plus:简化SQL映射和数据库访问。…...

微软发布 Phi-3.5 系列模型,涵盖端侧、多模态、MOE;字节 Seed-ASR:自动识别多语言丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…...

笔记:Echarts柱状图 实现滚轮条 数据太多

效果👇👇👇 配置:👇 let option {dataZoom: [{type: "slider",show: true,zoomLock: true,start: 0,end: 20,bottom: 60,height: 10,textStyle: {color: "transparent",fontSize: 9,},fillerColo…...

嵌入式学习day17(数据结构)

大纲 数据结构、算法数据结构: 1. 线性表:顺序表、链表(单向链表,单向循环链表,双向链表,双向循环链表)、栈(顺序栈,链式栈)、队列(循…...

网站怎么做敏感词过滤,敏感词过滤的思路和实践

敏感词过滤是一种在网站、应用程序或平台中实现内容审查的技术,用于阻止用户发布包含不适当、非法或不符合政策的内容。我们在实际的网站运营过程中,往往需要担心某些用户发布的内容中包含敏感词汇,这些词汇往往会导致我们的网站被用户举报&a…...

【峟思】如何使用投入式水位计才能确保测量准确性

在水利、环保、工业监测等众多领域,水位测量是一项至关重要的任务,它不仅直接关系到水资源的合理利用与保护,还影响到防洪、供水、排水等多个方面的安全与效率。投入式水位计作为一种常见的水位测量工具,以其结构简单、测量准确、…...

供应链管理系统(SCM) —— 企业物流的智能枢纽

SAP 供应链管理系统以打造数字化和集成化的供应链管理平台为使命,将传统的仓储管理系统、制造执行系统、产品管理系统等软件进行升级和上云管理,为企业提供面向客户、合作伙伴及员工的数字化SCM系统平台。 SAP SCM系统从设计到运维,全面优化供…...

计算机视觉(CV)技术的优势和挑战。

计算机视觉(CV)技术在许多领域中具有广泛的应用,并且具有一些优势和挑战。 优势: 1. 高效性:CV技术能够快速处理大量的图像和视频数据,以实现实时的分析和决策。 2. 自动化:CV技术可以自动化地…...

数据库MySQL多表设计、查询

目录 1.概述 2.一对多 3.一对一 4.多对多 5.多表查询 5.1内连接 5.2外连接 5.3子查询 1.概述 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个…...

基于vue框架的北城招聘管理平台题目7lly3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:用户,企业,企业信息,职位类型,职位信息,简历信息,职位应聘,求职意愿,面试信息,录取信息,实习信息,冻结信息,解冻信息 开题报告内容 基于Vue框架的北城招聘管理平台 开题报告 一、引言 随着互联网的飞速发展和企业对人才需求的不断增…...

详讲C#中如何存储当前项目的设置-超级简单省事

我们在编写软件的时候总有一些配置数据需要保存,比如用户选择的偏好设置,又如软件所用到的数据库文件等。我们有很多中方式都可以保存,比如直接保存在某个文本文件,或者ini文件中,其实最简单的办法是保存在项目的资源文…...

【QT文件操作】---xml文件读取

XML(可扩展标记语言,eXtensible Markup Language)是一种用于存储和传输数据的文本格式,广泛用于配置文件、数据交换和文档表示。XML 文件具有明确的结构和标记,这使得它能够描述复杂的层次结构和数据关系。 xml和html…...

科研软件 | Diamond 4.6 安装教程

软件介绍 Diamond一个化学专业软件。它是一款在原子水平实现晶体结构可视化的软件,包括分子和聚合物扩展、多面体、搜索结构数据、自动和批量创建结构图片等功能,支持晶体结构着色和渲染以及批注。 软件下载 https://pan.quark.cn/s/37214b5bec7c 软…...

利用keepalived达成服务高可用

官方网站Keepalived for Linux 1.keepalived简介 vrrp 协议的软件实现,原生设计目的为了 高可用 ipvs 服务 功能: 基于 vrrp 协议完成地址流动 为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 ) 为 ipvs 集群的各 RS 做健康状态检测 …...

Dumpy:一款针对LSASS数据的动态内存取证工具

关于Dumpy Dumpy是一款针对LSASS数据的动态内存取证工具,该工具专为红队和蓝队研究人员设计,支持重新使用打开的句柄来动态转储 LSASS。 运行机制 Dumpy可以动态调用 MiniDumpWriteDump 来转储 lsass 内存内容。此过程无需打开 lsass 的新进程句柄&…...

TinyEngine是什么?

TinyEngine 是 OpenTiny 项目下的一个开源低代码引擎,旨在帮助开发者快速构建应用程序。它提供了可视化搭建页面的能力,支持在线实时构建和二次开发或集成,适用于多种场景的低代码平台开发,例如资源编排、服务端渲染、模型驱动、移…...

FPGA跨时钟域处理

文章目录 一、为什么要做跨时钟域处理二、单bit信号从慢时钟到快时钟处理2.1 使用同步寄存器链(打两拍)2.2 仿真代码编写2.3 仿真结果观察 三、单bit信号从快时钟域到慢时钟域处理3.1 使用脉冲展宽3.2 仿真代码编写3.3 仿真结果观察 四、在任意时钟域跨单bit信号4.1 使用握手协…...

【Docker深入浅出】Docker镜像

文章目录 一. Docker镜像简介二. Docker镜像详解1. 镜像和容器的关系2. 镜像通常比较小3. 拉取镜像4. 镜像命名4.1. 镜像仓库服务4.2. 官方和非官方镜像仓库4.3. 镜像的命名和标签 5. 为镜像打多个标签6. 过滤镜像内容6.1. 虚空镜像6.2. 删除虚空镜像6.3. 过滤器与格式化输出 7…...