C++进阶——继承

前言:从这篇文章开始,我们进入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.mzph.cn/news/823209.shtml

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

相关文章

数据结构----链表算法题目

1.移除链表的元素 这个题目我们有多种解决方案 &#xff08;1&#xff09;思路A&#xff1a;遍历整串数据&#xff0c;如果是我们想要删除的数据&#xff0c;就让这个数字后面的数字全部向前移动直到整传数字全部遍历完成&#xff1b;这个方法的时间复杂度是N的平方&#xff…

ARM作业day8

温湿度数据采集应用&#xff1a; 由上图可知&#xff1a; 控制温湿度采集模块的引脚是PF14&#xff08;串行时钟线&#xff09;和PF15&#xff08;串行数据线&#xff09;&#xff1a;控制温湿度采集模块的总线是AHB4&#xff0c;通过GPIOF串口和RCC使能完成初始化操作。 控制…

MAC-OS低版本升级到高版本——亲测有效

关于MAC-OS 10.13.6 升级到10.15的实战 一.MAC 欧司如何查看他的系统版本 查看信息如图 二.,去官网下载新的MAC OS 系统 官网地址&#xff1a;如何下载和安装 macOS - 官方 Apple 支持 (中国) 三.点击安装 四.具体步骤可以参考官网 在兼容的 Mac 电脑上下载并安装最新或以前…

最新版idea 合并分支方法

前言 以下是最新版的idea2024&#xff0c;如果有人找不到按键可能是因为版本不同。 操作步骤 看右小角我的分支是submit&#xff0c;现在我要将test合并到我的submit分支上 找到test分支&#xff0c;选择update&#xff0c;这一步会拉取相应分支内容等同于pull 选择merge 选…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识&#xff1a; 并行通信/串行通信&#xff1a; 异步通信/同步通信&#xff1a; 半双工通信/全双工通信: UART串口&#xff1a; I2C串口&#xff1a; SPI串口&#xff1a; I2C在单片机中的应用&#xff1a; 软件模拟&#xff1a; 51单片机&#xff1a;…

PHP-file_get_contents(练习1)

[题目信息]&#xff1a; 题目名称题目难度PHP-file_get_contents(练习1)1 [题目考点]&#xff1a; file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持&#xff0c;还会使用内存映射技术来增…

同城O2O系统开发实战:外卖送餐APP的技术架构与实现

今天&#xff0c;我们将深入探讨同城O2O系统开发实战中&#xff0c;外卖送餐APP的技术架构与实现。 一、概述 外卖送餐APP是一种典型的O2O应用&#xff0c;通过移动互联网技术&#xff0c;将用户与商家连接起来&#xff0c;实现用户在线订餐&#xff0c;商家配送服务的模式。…

Git分布式版本控制系统——在IDEA中使用Git(一)

一、在IDEA中配置Git 本质上还是使用的本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git 打开IDEA的设置页面&#xff0c;按照下图操作 二、在IDEA中使用Git获取仓库 1、本地初始化仓库 2、从远程仓库克隆 方法一&#xff1a; 方法二&#xff1a; 三、.gitignore文件…

简单的网站-表白墙(前后端交互)

提交信息后&#xff0c;就得到了下面的一行话 但是存在一些问题 在一个网站中&#xff0c;服务器起到的最主要的效果&#xff0c;就是 “存储数据” 因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据 二、实现前后端交互 1&#xff09;先规定此处请求和响…

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper&#xff1a; 下载地址 解压&#xff0c;并进入bin目录&#xff0c;启动 如果闪退可以编辑脚本&#xff0c;在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg&#xff0c;就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

前端网络 --- http缓存

什么是http缓存&#xff1f; 1、HTTP 缓存会存储与请求关联的响应&#xff0c;并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本&#xff0c;当用户再次发起相同请求时&#xff0c;判断缓存是否命中&#xff0c;如果命中则将前面的响应…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 &#xff1a; S o r t i n g I t A l l O u t eg1&#xff1a;Sorting\ It\ All\ Out eg1&#xff1a;Sorting It All Out ( 蓝书例题&#xff0c;传递…

软硬链接与动静态库

文章目录 1.软硬链接2.动态库和静态库2.1 见一见库2.2 动静态库2.2.1 静态库2.2.2 动态库 2.3 动静态库的对比 3.真实的应用场景(ncurses库)4.库加载---可执行程序和地址空间4.1可执行程序的加载4.2 库的加载 1.软硬链接 2.动态库和静态库 2.1 见一见库 我们用过很多库。C/C的…

如何节约上架时间,小程序管理平台推荐

继微信正式推出微信小程序后&#xff0c;各个大厂陆续发布了各自的小程序平台 —— 支付宝小程序、百度小程序、头条小程序&#xff0c;各家不同的小程序标准一度让开发者们激情开骂&#xff0c;虽然目前跨平台的小程序开发可以通过taro、mpvue、kbone等跨平台开发框架来解决&a…

车载摄像头智能颜色校正解决方案,卓越画质新体验

随着智能交通和自动驾驶技术的快速发展&#xff0c;车载摄像头作为车辆感知外界环境的重要部件&#xff0c;其画面质量对于行车安全和用户体验至关重要。然而&#xff0c;由于光线变化、设备差异以及拍摄环境复杂多变&#xff0c;车载摄像头拍摄的画面往往会出现颜色失真、对比…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。为了确保 API 的可靠性和性能&#xff0c;开发人员需要一种高效的方式来测试和调试它们。这方面的工具&#xff0c;大家经常用到的应该就是 postman 了。不过&#xff0c;今天想要给…

[Qt网络编程]之获取基本网络信息

前言 获取主机的网络地址和接口信息是进行网络编程的第一步&#xff0c;也是网络编程的基础。Qt提供了网络接口类 QNetworkInterface、网络地址人口类 QNetworkAddressEntry 和主机地址类 QHostAddress 来获取和使用地址信息。其中网络接口类 QNetworkInterface 描述了主机的卫…

短信防刷之滑动验证码

前言&#xff1a;最近想写一个滑动验证码&#xff0c;前台的样式虽然很好看&#xff0c;但是并不安全&#xff0c;网上也都是一些demo&#xff0c;不是前后台分离的&#xff0c;然后就自己查资料&#xff0c;自己来完成了 滑动验证码 一、为什么要使用滑动验证码 首先&#x…