C++进阶——继承

news/2024/5/21 18:40:33

前言:从这篇文章开始,我们进入C++进阶知识的分享,在此之前,我们需要先来回顾一个知识:

C++语言有三大特性,分别是封装、继承和多态,而我们前边所分享的各种容器类,迭代器等,它们所体现的就是封装

  • 将数据和方法放在一起,能够给用户访问就设为公有,不给用户访问就设为私有或保护。
  • 可以将一个类型放到另一个类型里边,通过typedef成员函数调整,封装出一个全新的类型。

这篇文章,我们将分享C++的第二大特性——继承


目录

一.何为继承

二.继承方式 

 三.继承关系

四.父类和子类对象赋值转换

五.继承中的作用域

六.派生类的默认构造函数

七.其他简单知识

总结


一.何为继承

举个例子:

在学校这一个大的教育机构中,有学生,老师,保安,宿管等等人员的存在。这些人的身份不同,那么就会有一些自己所独有的标签,比如学生有学生号,老师有职工号等。但是他们同时也都有共同的特性,比如姓名,年龄等等

他们有共同的标签,也有独有的标签,如果每个身份都要单独为他们创造标签,这样是不是过于繁琐,于是就有了继承的概念:

封装一个父(基)类,里边封装有这些人所具有的共同属性,比如姓名,年龄。随后通过父类继承出多个子(派生)类,子类既可以拥有父类中的属性,也可以自己建立自己独有的属性


二.继承方式 

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}string _name;//姓名int _age;//年龄
};class Student : public Person
{
protected:int _stuid;//学号
};
class Teacher : public Person
{
protected:int _jobid;//职工号
};

来看,Person作为父类,用于一个成员函数和两个成员变量Student和Teacher通过"public"方式继承父类,同时也拥有自己的成员变量。来看测试:

 

能够看出,子类能够使用父类中的成员变量而后成员函数。


 三.继承关系

在类中有public、protected、private三种访问方式。这些访问方式的不同,会影响到子类对父类中的成员变量和函数的访问

这三种访问方式可以理解为三级权限,public为低级权限,protected为中级权限,private为高级权限

这里给出最简单的理解方法,较低级的权限要向较高级的权限低头。 

前边在类的讲解中我们没有分享protected和private的区别,这里我们给出二者的区别:

父类的private成员在类外任何地方都不能被访问,包括派生类,而父类的protected成员可以在派生类中访问

一般情况下,public继承是最常用的

此外,我们知道struct也可以定义类,也可以继承父类,它与class的区别是:

  • struct默认的继承方式和访问限定符为public。
  • class默认的继承方式和访问限定符为private。

四.父类和子类对象赋值转换

通过标题,我们能够得出信息,父类对象和子类对象直接可以赋值,但是这里我先强调:只能由子类对象赋值给父类对象,而不能父类对象赋值给子类对象

直接来看例子:

要注意的是,父类对象只能得到自己继承下去的成员变量的信息,而不能得到子类自己的成员变量

除此之外,我们还可以通过父类对象的引用或指针来访问或修改子类对象的成员变量

因为父类对象中没有子类对象的成员变量,所以不能对其赋值。 


五.继承中的作用域

  1. 在继承体系中父类和子类都有独立的作用域
  2. 子类和父类中有同名成员在调用该成员时,子类会默认调用自己的成员,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问父类的同名成员
  3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏与参数无关
  4. 注意在实际中在继承体系里面最好不要定义同名的成员

来看实例:

class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}string _name;//姓名int _age;//年龄int _num = 0;
};class Student : public Person
{
public:void fun(){cout << _num << endl;cout << Person::_num << endl;}
protected:int _stuid;//学号int _num = 1;
};

这里我们分别在Person和Student类中都定义了名为_num的成员变量,并在Student类中定义fun函数来打印二者,结果如下:

 

能够看出,默认情况下访问的是Student类自己的_num,加了域作用限定符后才会调用父类的_num。同名成员函数同理


六.派生类的默认构造函数

6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?

  1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。
  2. 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
  3. 派生类的operator=必须要调用基类的operator=完成基类的复制。
  4. 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  5. 派生类对象初始化先调用基类构造再调派生类构造。
  6. 派生类对象析构清理先调用派生类析构再调基类的析构。

总结来说, 子类自己的成员变量调用自己的默认成员函数,而继承自父类的成员则需调用父类的默认成员函数父类没有的,就在子类中补充


七.其他简单知识

  1. 父类的友元,子类无法直接使用,但也可以将该友元定义在子类中,成为子类的友元。
  2. 父类的静态成员,与所有的子类共用。
  3. 一个子类可以同时继承多个父类,但是不推荐这样设计。

总结

关于继承的知识就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!


http://www.mrgr.cn/p/81665446

相关文章

团队博客

项目原型展示说明 “冀网社区聘”——社区招聘项目 是否为日常生活问题感到困扰?是否在因不熟悉的工作愁眉苦脸?我们“冀网社区聘”平台致力于为客户提供快捷,直接的服务。在我们的“冀网社区聘”平台上,雇主可以轻松发布社区内或者跨社区招聘需求,而相应的求职者则可以浏…

JS混淆代码数据集构建方法

数据获取(1)公开JS数据集,比如CodeSearchNet; (2)自行构建JS数据集,爬取Github开源前端项目;数据描述Github中采集前端项目文件分类如下,从中提取JS文件数据预处理其中比较重要的步骤:(1)代码混淆:使用现有工具,如UglifyJS、Terser、babel-minify、JS-Obfuscator…

Java API之查询文档

1、查询指定id文档import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.RequestOptions; import org.util.ConnectElasticsearch;public class GetDoc {public static void main(String[] arg…

基于STM32智能垃圾桶系统设计(论文)_kaic

摘 要 城市的不断扩张建设&#xff0c;生活中产生了大量垃圾&#xff0c;垃圾桶现在是非常多的在我们生活中是不可或缺的一部分&#xff0c;环卫工人每天都是在整理收拾垃圾&#xff0c;会造成很多的麻烦&#xff0c;为了解决这个问题我们研究出了基于STM32智能垃圾桶系统设计…

[9] UE C++ Snake

思维导图背景地图制作 创建瓦片集角色素材GameMode功能 游戏开始控制食物的生成食物生成池(性能优化) /**形参如果是一个引用,且没有添加const关键字,代表实参想要借助形参修改值* param 是否指定生成时候的地址*/ void ASnakeGameModeBase::SpawnFood(FVector& SpawnLoc…

服务器raid卡,守护数据安全,赋能新质生产力

RAID卡,全称为独立冗余磁盘阵列卡,在数据中心、服务器、网络存储等领域得到广泛应用,RAID卡通过不同的RAID级别实现数据容错和冗余。例如,RAID 0主要适用于需要高速数据传输但对数据安全要求不高的场景,如数据的缓存;RAID 1使用镜像备份确保数据不因硬盘故障而丢失。然而…

Spring Boot 拦截器

拦截器是Spring 框架提供的核心功能之一&#xff0c;主要用于拦截用户的请求&#xff0c;在指定方法的前后根据业务需要执行代码。 例如登录场景&#xff0c;有可能我们访问一个网页时&#xff0c;我们的登录信息过期了&#xff0c;就需要重新登录&#xff0c;那么就可使用拦截…

夜莺监控 V7 第二个 beta 版本发布,内置集成故障自愈能力,简化部署

经过一个半月的打磨改进,夜莺监控 V7 第二个 beta 版本发布了,本次发布的主要亮点是内置集成故障自愈能力,简化架构,同时做了其他 19 项改进。一些重要的改进如下:feat: 集成故障自愈的能力,不需要再单独部署 ibex 模块了 refactor: 内置仪表盘和内置规则页面重构 refact…

cowa新的数据筛选代码

cowa新的数据筛选代码 代码地址&#xff1a; https://git.cowarobot.com/lhb/data_extracting 一阶段筛选 修改配置文件 config/common_stage.yamlversion: 3 services:de:image: harbor.cowarobot.cn/lhb/data:crpilot2.5-torch2.2environment:- CRPILOT_INSTALL_VERSIONx86…

JavaFx项目打包成exe,并集成Jre,使Java项目在任意机器运行

1.关键点:通过springboot打包插件,将项目依赖都打到一个jar包内。 以下是pom配置文件:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1…

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

react17 + antd4 如何实现Card组件与左侧内容对齐并撑满高度

在使用antd进行页面布局时&#xff0c;经常会遇到需要将内容区域进行左右分栏&#xff0c;并在右侧区域内放置一个或多个Card组件的情况。然而&#xff0c;有时我们会发现右侧的Card组件并不能与左侧的栏目对齐&#xff0c;尤其是当左侧栏目高度动态变化时。本文将介绍如何使用…

vue简单使用三(class样式绑定)

目录 对象的形式绑定&#xff1a; 数组的形式绑定&#xff1a; 内联样式Style 对象的形式绑定&#xff1a; 可以看到class中有两个值 数组的形式绑定&#xff1a; 可以看到也有两个值 内联样式Style style样式设置成功 完整代码&#xff1a; <!DOCTYPE html> <html…

小程序技术实现前端热更新的优势

小程序作为轻量级的移动应用形态,凭借其无需下载安装、即用即走的特性,迅速获得用户的青睐。同时,小程序技术也为前端热更新提供了天然的优势。通过 Service Worker 等机制,小程序可以拦截网络请求,动态更新前端代码,而无需用户重新下载应用。小程序技术是一种很有前景的…

互联网轻量级框架整合之MyBatis核心组件

在看本篇内容之前&#xff0c;最好先理解一下Hibernate和MyBatis的本质区别&#xff0c;这篇Hibernate和MyBatis使用对比实例做了实际的代码级对比&#xff0c;而MyBatis作为更适合互联网产品的持久层首选必定有必然的原因 MyBatis核心组件 MyBatis能够成为数据持久层首选框&a…

2024.4.16(周二)腾讯公益赛构思展示

团队成员:郑天羽 张晨旭 孙怡然产品介绍:

基于RAM的几何变换——镜像

基于RAM的几何变换——镜像 一、镜像基本概念 镜像变换可以分为水平镜像和竖直镜像,也就是我们所理解的x轴对称和y轴对称问题。可以预见的是,简单的打拍以及无法满足缓存了,要想实现水平镜像起码需要缓存一整行数据,要想实现垂直镜像起码要缓存一帧数据。这里我们可以直接思…

uniCloud云函数概述---公用模块

公用模块可以被普通云函数、云对象调用。它存放在cloudfunctions/comon文件夹内。一、创建公用模块 打开项目,右击cloudfunctions/comon文件夹,选择“新建公用模块”创建好的公共模块包含二个文件: index.js //公共模块文件 package.json //配置文件二、公用模块模板 A)公…

光明与速度:AI网络中GPU与光模块的协奏曲

&#x1f3b6;在人工智能&#xff08;AI&#xff09;的世界里&#xff0c;GPU和光模块是实现高速计算和数据传输的关键。它们如同一场精心编排的交响乐&#xff0c;每个部分都不可或缺&#xff0c;共同创造出美妙的和谐。&#x1f3bc; GPU&#xff1a;AI网络的心脏&#x1f4…

实用工具系列-ADB使用方式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff0…