C++证道之路第十三章类继承

一、一个简单的基类

从一个类派生出另一个类时,原始类称为基类,继承类称为派生类。

派生类对象储存了基类的数据成员(派生类继承了基类的实现)。

派生类对象可以使用基类的方法(派生类继承了基类的接口)。

需要在继承特性中添加什么呢?

派生类需要自己的构造函数。

派生类可以根据需要添加额外的数据成员和成员函数。

构造函数:访问权限的考虑

派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。具体的说,派生类构造函数必须使用基类构造函数。

有关派生类构造函数的要点如下:

首先创建基类对象;

派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数;

派生类构造函数应初始化派生类新增的数据成员;

注意:创建派生类对象时,程序首先调用基类构造函数,然后在调用派生类构造函数。基类构造函数负责初始化继承的数据成员;派生类构造函数主要用于初始化新增的数据成员。派生类的构造函数总是调用一个基类构造函数。可以使用初始化列表语法指明要使用的基类构造函数,否则将使用默认的基类构造函数。

派生类对象过期时,程序将首先调用派生类析构函数,然后在调用设计类析构函数。

派生类和基类之间的特殊关系

派生类与基类之间有一些特殊关系。

其中之一是派生类对象可以使用基类的方法,条件是方法不是私有的

另外两个重要的关系是:基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象;

继承is-a关系

派生类和基类之间的特殊关系是基于C++继承的底层模型的。实际上,C++有3中继承方式:公有继承、保护继承和私有继承。

公有继承是最常用的方式,它建立一种is-a的关系,即派生类对象也是一个基类对象,可以对基类对象执行的任何操作,也可以对派生类对象执行。

多态公有继承

在派生类中重新定义基类的方法;

使用虚方法。

注意:如果要再派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。为基类声明一个虚析构函数 也是一种惯例。

静态联编和动态联编

程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题。将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。

提示:如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则设置为非虚方法。

使用虚函数时,在内存和执行速度方面有一定的成本,包括:

每个对象都将增大,增大量为储存地址的空间;

对于每个类,编译器都创建一个虚函数地址表(数组)。

对于每个函数调用,都需要执行一项额外的操作,即到表中查找地址。

虽然非虚函数的效率比虚函数稍高,但不具备动态联编功能。

有关虚函数注意事项

在基类方法的生命中使用关键字virtual可使该方法在基类以及所有的派生类(包括从派生类派生出来的类)中是虚的。

如果使用指向对象的引用或指针来调用虚方法,程序将使用为对象类型定义的方法,而不使用为引用或指针类型定义的方法。这成为动态联编或晚期来那边。这种行为非常重要,因为这样基类指针或引用可以指向派生类对象。

如果定义的类将被用作基类,则应将那些要在派生类中重新定义的类方法声明为虚的。

构造函数

构造函数不能是虚函数

析构函数

析构函数应当是虚函数,除非类不用做基类

给类定义一个虚析构函数并非错误,即使这个类不用做 基类;这只是一个效率方面的问题。

提示:通常应给基类提供一个虚析构函数,即使它并不需要析构函数。

友元

友元不能是虚函数,因为友元不是类成员,而只有成员才能时虚函数。如果由于这个原因引起了设计问题,可以通过让友元函数使用虚成员函数类解决。

没有重新定义

如果派生列没有重新定义函数,将使用该函数的基类版本。如果派生类位于派生链中,则将使用最新的虚函数版本,例外的情况是基类版本是隐藏的。

如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以修改为指向派生类的引用或指针。这种特性被称为返回类型协变,因为允许返回类型随类类型的变化而变化。

如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。

访问控制:protected

派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。

警告:最好对类数据成员采用私有访问控制,不要使用保护访问控制;同时通过基类方法是派生类能够访问基类数据。

抽象基类

继承和动态内存分配

第一种情况:派生类不使用new

第二种情况:派生类使用new

有关使用基类方法的说明:

以公有方式派生的类的对象可以通过多种方式来使用基类的方法。

派生类对象自动使用继承而来的基类方法,如果派生类没有重新定义该方法。

派生列的构造函数自动调用基类的构造函数。

派生类的构造函数自动调用基类的默认构造函数,如果没有再成员初始化列表中指定其他构造函数。

派生类构造函数显式的调用成员初始化列表中指定的基类构造函数。

派生类方法可以使用作用域解析运算符来调用公有的和受保护的基类方法。

派生类的友元函数可以通过强制类型转换,将派生类引用或指针转换为基类引用或指针,然后使用该引用或指针来调用基类的友元函数。

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

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

相关文章

PY32F040单片机产品介绍,LQFP封装,带LCD 驱动器

PY32F040单片机搭载了 Arm Cortex-M0内核,最高主频可达72 MHz,专为高性价比、高可靠性的系统而设计,符合消费市场的基本设计需求。可广泛应用于电机控制、手持设备、PC 外设、以及复杂的数字控制应用等领域。 PY32F040片内集成 UART、I2C、S…

手机空号过滤,提高工作效率

手机空号过滤在多个方面都具有重要的作用。 首先,它对于短信群发商和电话营销商来说至关重要。通过空号过滤,他们可以确保手机号码数据库的准确性和有效性。由于每天都有大量人群因各种原因更换手机号码,导致每个号段中的空号率和手机状态都…

Debian 系统设置SSH 连接时长

问题现象: 通过finalshell工具连接Debian系统远程操作时,总是一下断开一下断开,要反复重新连接 ,烦人! 解决办法: 找到ssh安装目录下的配置文件:sshd_config vi sshd_config : 找到…

【喜报】科大睿智为武汉博睿英特科技高质量通过CMMI3级评估咨询工作

武汉博睿英特科技有限公司是信息通信技术产品、建筑智慧工程服务提供商。其拥有专注于航空、政府、教育、金融等多行业领域的资深团队,及时掌握最新信息通信应用技术,深刻理解行业业务流程,擅于整合市场优质资源,积极保持与高校产…

STM32 SPI通信

一、SPI总线简介 1.1 SPI总线 串口外设接口(Serial Peripheral Interface,SPI)总线是一种同步串行外设接口,允许MCU与各种外围设备进行全双工、同步串行通信 SPI总线有四根通信线: ①SCK(Serial Clock&a…

linux的压缩与备份

一、打包 格式&#xff1a;tar -参数 <打包文件名> <打包的目标> 作用&#xff1a;将文件或者目录打包 重要参数&#xff1a;-f 使用归档文件&#xff0c;一定要加上这个参数 -c 新建打包文件 -x 解包文件 -t 可以不用解包就能查看包文件内容 -v 打包和解包时显…

JVM的垃圾回收机制(GC机制)

在Java代码运行的过程中&#xff0c;JVM发现 某些资源不需要再使用的时候&#xff0c;就会自动把资源所占的内存给回收掉&#xff0c;就不需要程序员自行操作了。“自动回收资源”就是JVM的“垃圾回收机制”&#xff0c;“垃圾回收机制”也称"GC机制"。 对于Java代码…

C语言指针进阶_字符指针、指针数组、数组指针、函数指针等的介绍

文章目录 前言一、字符指针二、指针数组三、 数组指针1. 数组名和 & 数组名2. 数组指针3. 数组指针解引用 四、数组指针的使用二维数组的传参说明数组指针使用小测验 五、数组传参和指针传参1. 一维数组传参总结2. 二维数组传参总结3. 一级指针传参4. 二级指针传参 六、函数…

java案例-服务端与客户端(传输对象)

需求 代码 SysUser 用户类Operation 操作类Client 客户端Server 服务端ServerReaderThread 服务端线程类 SysUser 用户类 需要实现Serializable 方便序列化&#xff0c;传输对象 public class SysUser implements Serializable {private String username;private String passwo…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…

【Node.js工程师养成计划】之原生node开发web服务器

一、使用node创建http服务器 var http require(http);// 获取到服务器实例对象 var server http.createServer() server.listen(8080, function() {console.log(http://127.0.0.1:8080); })server.on(request, function(req, res){console.log(request);res.write(6666666688…

如何利用 GPT 自我提高写作能力

GPT革命&#xff1a;如何用AI技术重新定义写作 介绍 在我们的数字时代&#xff0c;了解自我提高写作的必要性至关重要。 随着 GPT 的兴起&#xff0c;我们正在见证书写的变革时代。 这篇扩展文章深入探讨了 GPT 如何显着提高写作技能。 拥抱未来&#xff1a; 人工智能时代的写…

Maven介绍 主要包括Maven的基本介绍,作用,以及对应的Maven模型,可以对Maven有一个基本的了解

1、Maven介绍 1.1 什么是Maven Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。 官网&#xff1a;https://maven.apache.org/ Apache 软件基金会&#xff0c;成立于1999年7月&#xff0c;是目前世界上最大的最受欢迎的开源软件基金会&…

Elasticsearch实现hotel索引库自动补全、拼音搜索功能

Elasticsearch实现hotel索引库自动补全、拼音搜索功能 在这里边我们有两个字段需要用拼音分词器&#xff0c;一个name字段&#xff0c;一个all字段。 然后我们还需要去实现自动补全&#xff0c;而自动补全对应的字段必须使用completion类型。目前我们酒店里面所有的字段都采用的…

【SpringBoot】00 Maven配置及创建项目

一、Maven配置 1、下载Maven 进入官网下载&#xff1a;Maven – Welcome to Apache MavenMaven – Download Apache Maven 本文以最新版为例&#xff0c;可按需选择版本 Maven – Welcome to Apache Maven 2、解压下载好的安装包 将安装包解压到自己设置的空文件夹中 3、…

AI视频教程下载:构建一个ChatGPT股票配对交易机器人

ChatGPT及其后续版本GPT-4已经开始改变世界。人们对新机会感到兴奋&#xff0c;同时对我们社会可能受到的影响感到恐惧。这门课程结合了两个主题&#xff1a;AI和财务&#xff08;算法交易&#xff09;。 你将会学到的&#xff1a; 使用ChatGPT构建一个Python配对交易机器人 …

(Linux)Centos7.*版本安装配置Java环境、Tomcat、Nginx并打包部署SSM框架web系统

一、准备软件与安装包 (一)、必须的软件 1、点击下载Xshell 2、点击下载FileZilla (二)、准备安装包 1、点击下载JDK1.8Linux版本 2、点击下载Nginx 3、点击下载Tomcat 二、关于FileZilla软件的使用说明 (一)、FileZilla软件的打开和说明 (二)、配置服务器地址去连…

理解ROS2的动作

​ 1. 创建一个动作 目标&#xff1a; 在ROS 2软件包中定义一个动作。 1.1 新建包 设置一个 workspace 并创建一个名为 action_tutorials_interfaces 的包&#xff1a; mkdir -p ros2_ws/src #you can reuse existing workspace with this naming convention cd ros2_ws/s…

NLP发展及其详解

一、RNN(循环神经网络) 在这里附上一个很好的笔记 零基础入门深度学习(5) - 循环神经网络 RNN(循环神经网络)的结构特点在于其循环单元的设计,这种设计允许网络在处理序列数据时保持对之前信息的记忆。下面详细解释RNN的结构: 循环单元:RNN的循环单元是网络的核心,它…

基于Springboot的爱心商城系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的爱心商城系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…