【C++】继承(上)(超详细,保证你学会)

什么是继承?

1.语法

1.1例子

通过这种方法,Student和Teacher这两个类就继承了Person的成员变量和成员函数,可以直接调用它们。

如图,如果成员变量和成员函数在基类中是公有的话就可以直接访问!但如果是私有和保护的话就无法访问。

1.2继承基类成员访问方式的变化

1.先看这个表格的最后一行,只要在基类中是私有成员,不论哪种继承方式,在派生类中均不可见。这里的不可见不是说真的不可见,而是在派生类外边和里边不可以直接访问,但是派生类可以通过基类中公有成员函数访问。(注意,不论是成员函数还是成员变量都是成员,如果它们是私有,都不能直接在类外面访问,只能通过其他公有的成员函数访问)。

2.另外两行需要记住一个规则(权限:public>protected>private)。记住这个规则后,在继承过程中,最终结果去权限小的那一个。

比如,基类的protected成员被派生类public继承后,由于protected权限小于private,所以基类的protected成员在派生类中依然是保护成员。

再比如,基类的protected成员被派生类private继承后,由于protected权限大于private权限,所以基类的protected成员在派生类中变成private成员。

1.2.1protected和private的区别

解释一下,基类中的private成员不光在基类和派生类外面不能访问,而且派生类里面也不能访问。

而基类中的protected成员,在基类和派生类外面不能访问,但在派生类里面可以被访问。

熟悉继承的语法后就可以理解,其实实践中用得最多的直接上面的一小部分。因为继承的意义在于派生类能够顺畅的使用基类的成员,所以protected继承和private继承就极少用到。所以我们在日常的学习甚至工作中记住上面这个小表格就足够了。

再补充一下,struct也可以继承,但要注意与class的区别。

1.class的默认访问限定符是private,在没写继承方式时,继承方式同样默认private继承。‘

2.struct的默认访问限定符是public,在没写继承方式时,继承方式同样默认public继承。

虽然它们有默认的访问限定符和默认的继承方式,但还是建议写上,一是格式更加标准,二是提高代码的可读性。

2.基类和派生类对象赋值转换

在派生类对象对基类对象赋值时,不会产生临时对象,所以在传引用时不用加const(可以理解为编译器的特殊处理)。但是基类对象不可以赋值给派生类对象。

赋值兼容,编译器进行特殊处理。

这是is -a的关系,就把派生类和基类当成一个类型,在赋值过程中没有类型的转换就不产生临时对象。所以传引用和传指针时,通过派生类改变成员变量,基类中的也会随之改变。

因为基类的对象的成员变量派生类中都有,所以在赋值时,相当于在把派生类中含有基类成员变量的部分进行切片然后赋值给基类。传指针时,基类的指针同样指向该切片的空间。所以在传引用和指针后,对基类的成员变量修改,会让派生类对应的成员变量发生改变。

派生类中的内置类型成员直接赋值给基类,自定义类型成员调拷贝构造给基类。

3.继承中的作用域

学到现在,一共有几个域的概念:

1.局部域 2.全局域 3.命名空间域 4.类域

局部域和全局域会影响访问也会影响声明周期(同一个域不能有同名变量和同名函数,不同的域可以同名),类域和命名空间域只影响访问不影响声明周期。

在类域中又可以细分为基类的类域和派生类的类域。

基类和派生类可以有同名的成员变量,在访问时遵循“就近原则”。在派生类访问时,默认访问派生类的,如果想访问基类的,需要域作用限定符。

3.1练习一下

这个题目的正确答案是D。

对于C:两个函数构成重载的前提是:1.在同一个域中。2.函数命相同。3.参数不同。所以C不对。

公有继承后,在派生类里面,同名函数这样访问:

在派生类外面,同名函数这样访问:

把基类成员当成一个整体,把它们看成一个自定义类型。派生类成员还是和以前一样。

在派生类对象实例化时,会调用父类的默认构造函数,如果没有,编译报错。

回顾一下类和对象中的构造函数:

在对象实例化时,编译器默认生成的构造函数对于成员变量中的内置类型(int char等)不做处理,对于自定义类型(vector string等),去调用它们自己的默认构造。

关于构造函数

如果基类没有默认构造函数,编译报错:

除非在派生类的构造函数中显式的调用基类的构造函数:

当然如果基类中有默认构造函数,就不需要在派生类的构造函数中显式的调用基类的构造函数了:

类比:

如果不用继承,就把Person当成BB的成员,在Person没有默认构造时,同样需要在BB的构造函数中显式的调用Person的构造函数,区别就是继承类似于匿名对象的初始化,这个是有名的。

因此,继承,你就可以想象成有一个基类对象变成了派生类的成员,所以它是一个整体,它的初始化只能去调它的构造函数,不可以在派生类的构造函数中逐一初始化它的成员。

关于拷贝构造:

对于派生类调用编译器默认生成拷贝构造时,对于内置类型进行值拷贝。对于自定义类型(vector,string)调用它们的拷贝构造,对于基类(也是自定义类型),也是调用基类的拷贝构造。(所以一般派生类中编译器默认生成的拷贝构造是够用的)。

假设需要显示的写拷贝构造:

这是基类的拷贝构造。

这是派生类的拷贝构造(借用了基类的拷贝构造,利用了切割/切片)。

关于赋值:

派生类调用赋值时(编译器默认生成的),对于内置类型直接赋值,对于自定义类型(包括基类)回去调用它们的赋值。

如果显示的写,如下:

对于析构函数:

派生类的析构会隐藏基类的析构,需要基类的访问限定符才能访问到基类的析构。

构造要求先父后子,析构要求先子后父。

因此:

所以:

在派生类的析构函数中不要手动调用基类的析构函数,否则基类会析构两次!

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

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

相关文章

4种前端处理文本换行展示

序: 后端传递了一大段包含了回车符的文本内容,前端展示的时候所有文字堆在一起,没有换行展示。以下方法中content为后端返回的文本内容 方法一: “↵”符号在html中会识别别为\r,\n等转义字符,所以我们可以使用\r\n去替换(.replace(/(\r\n|\n|\r)/gm, ’< br />…

【FFmpeg】调用ffmpeg库进行RTMP推流和拉流

【FFmpeg】调用ffmpeg库实现RTMP推流 1.FFmpeg编译2.RTMP服务器搭建3.调用FFmpeg库实现RTMP推流和拉流3.1 基本框架3.2 实现代码3.3 测试3.3.1 推流3.3.2 拉流 参考&#xff1a;雷霄骅博士, 调用ffmpeg库进行RTMP推流 示例工程 【FFmpeg】调用FFmpeg库实现264软编 【FFmpeg】…

/usr/bin/ld: cannot find -l<nameOfTheLibrary>

在编译程序报了如下错误&#xff1a;/usr/bin/ld: cannot find -lmtcr_ul: No such file or directory 他的命名规则时"lnameOfTheLibrary"&#xff0c;所以我缺少一个mtcr_ul相关的库 问题原因 根本原因&#xff1a;还是某一个lib库文件不存在&#xff0c;你可以通…

SpringAMQP Work Queue 工作队列

消息模型: 代码模拟: 相较于之前的基础队列&#xff0c;该队列新增了消费者 不再是一个&#xff0c;所以我们通过代码模拟出两个consumer消费者。在原来的消费者类里写两个方法 其中消费者1效率高 消费者2效率低 RabbitListener(queues "simple.queue")public voi…

简化 KNN 检索【翻译】Simplifying kNN search

简化 KNN 检索 #转载 #大数据/ES #翻译 这篇文章是关于如何简化 k 最近邻&#xff08;k-Nearest Neighbors&#xff0c;简称 kNN&#xff09;搜索的深入探讨。以下是对全文的翻译(借助 kimi AI)&#xff1a; 在这篇博客文章中&#xff0c;我们将深入探讨我们为使 kNN 搜索的入…

mes系统业务学习

MES-生产溯源: 一物一码&#xff1a;一物一码&#xff0c;通过包装物或产品本身的条码追溯相关联原料、供应商、客户、订单、生产人员、生产过程、质检报告、售后等关键信息&#xff0c;覆盖产品全生命周期。精准质量追溯&#xff1a;通过采集扫描即时记录跟踪每一个关键信息&…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…

Selenium定位方法及代码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

中国1KM年相对湿度数据集1981-2020

大气相对湿度&#xff08;RH&#xff09;是气象/气候监测和研究的关键因素。然而&#xff0c;相对湿度在气候变化研究中的应用并不是很普遍&#xff0c;部分原因是相对湿度观测系列容易由于观测系统中的非气候变化而产生不均匀偏差。 该数据集是中国1km分辨率年相对湿度数据&am…

使用依赖注入(DI)的方式实现对冗余代码的解耦

1.1、优化前代码 GetMapping("/test") public void test(RequestParam("params") String params){if("1".equals(params)){// 逻辑代码}if("2".equals(params)){// 逻辑代码}if("3".equals(params)){// 逻辑代码} }1.2、优…

『大模型笔记』Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!

Google DeepMind and Isomorphic Labs联合发布AlphaFold 3! 文章目录 一. Google DeepMind and Isomorphic Labs联合发布AlphaFold 3!AlphaFold 3 及其后续研究总结视频中提到的局限性AlphaFold Server结论二. 参考文献中文字幕视频链接,欢迎关注我的xhs账号:Google CEO 皮…

【MsSQL】数据库基础 库的基本操作

目录 一&#xff0c;数据库基础 1&#xff0c;什么是数据库 2&#xff0c;主流的数据库 3&#xff0c;连接服务器 4&#xff0c;服务器&#xff0c;数据库&#xff0c;表关系 5&#xff0c;使用案例 二&#xff0c;库的操作 1&#xff0c;创建数据库 2&#xff0c;创建…

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通

华为配置Ethernet over GRE实现AC与无线网关之间的二层互通 组网图形 图1 通过Ethernet over GRE实现AC与无线网关之间的二层互通的组网图 组网需求数据规划配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业通过无线网络为用户提供上网服务&#xff0c;其中A…

探索静态住宅代理IP:网络安全的隐形守护者

在当今这个数字化高速发展的时代&#xff0c;网络安全问题愈发凸显其重要性。无论是企业级的网络运营&#xff0c;还是个人用户的网络活动&#xff0c;都需要一个安全、稳定的网络环境。而在这个环境中&#xff0c;静态住宅代理IP以其独特的优势&#xff0c;逐渐成为了网络安全…

Java——类与对象

目录 一、面向对象的初步认识 1.1 什么是面向对象 1.2 面向对象与面向过程 二、类的定义与使用 2.1 简单认识类 2.2 类的定义格式 三、类的实例化 3.1 什么是实例化 3.2 类和对象的说明 四、this引用 4.1 为什么要有this引用 4.2 什么是this引用 ​编辑 4.3 this引用…

鸿蒙OpenHarmony:【常见编译问题和解决方法】

常见问题 常见编译问题和解决方法 鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 提示“usr/sbin/ninja: invalid option -- w” 现象描述&#xff1a; 编译失败&#xff0c;提示“usr/sbin/ninja: invalid…

GO: 定时器NewTimer、NewTicker 和time.After

Go 之iota iota是一个常量计数器&#xff0c;一般在常量表达式中使用&#xff0c;可以理解为const定义常量的行数的索引&#xff0c;注意是行数 使用场景 主要应用在需要枚举的地方 示例1 package main import "fmt" const (NoPay iota // 订单未支付 0Pai…

设备二维码怎么生成?三分钟即可搞定

在现代工业生产中&#xff0c;设备的维护和巡检是保障生产连续性和安全性的重要环节。随着技术的发展&#xff0c;二维码技术因其便捷性和高效性被广泛应用于设备巡检中。 给每个设备配备一个二维码&#xff0c;一线人员用手机扫一扫&#xff0c;几秒钟就能上报巡检结果&#…

Measurement and Analysis of Large-Scale Network File System Workloads——论文泛读

ATC 2008 Paper 分布式元数据论文阅读笔记整理 问题 网络文件系统在当今的数据存储中发挥着越来越重要的作用。使用网络文件系统可以降低管理成本&#xff0c;从多个位置可靠地访问的数据。这些系统的设计通常以对文件系统工作负载和用户行为的理解为指导[12&#xff0c;19&a…