c++ - 第13节 - c++中的继承

news2024/11/26 12:41:25

1.继承的概念及定义

面向对象三大特性:封装、继承、多态
注:面向对象不止这三个特性,还有其他特性,比如反射(Java中的概念)、抽象等
封装的理解:
(1)将c++设计的stack类(进行了封装)和c语言设计的stack类(没有进行封装)对比,用c语言设计的stack类没有封装可能导致他人随意访问,不规范、过于自由。这里从类和类中访问限定符的角度来看,封装更好。(狭义的角度)
(2)以迭代器的设计为例,如果没有迭代器,那么容器的访问只能暴露底层结构,如果暴露底层结构,那么使用起来会很复杂、使用成本很高,并且对使用者的要求极高(每个人都要去剖析源码)。像迭代器这样封装了容器底层结构,在不暴露底层结构的情况下,提供了统一的访问容器方式,降低使用成本,简化使用。
(3)以stack、queue、priority_queue这样的适配器模式设计为例,如果不用适配器这种模式,那么我们就需要自己去完全实现stack等,这样有很大的冗余性,我们设计成适配器模式,不仅降低了冗余性,而且可以自己选择容器来封装实现stack等,这也是一种封装。

1.1.继承的概念

继承(inheritance) 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
例如:设计一个图书管理系统,管理系统的角色类可以分为学生、老师、保安等,这些角色的许多数据和方法是大家都有的,比如说名字、年龄、电话等,也有很多数据和方法是每个角色独有的,如果对每个角色都创建一个类初始化这些信息那很多大家都有的信息就设计重复了,写代码要进行复用。
我们可以设计一个person类,person类里面是每个角色都有的数据和方法,然后再设计每一个角色的类,这些角色的类继承person类,也就是这些角色类也具有person类的数据和方法,如下图所示。

从上面这个例子可以看出,继承的本质是类设计角度的复用。我们把上面例子中的person类称为父类或基类,把student和teacher类称为子类或派生类

1.2.继承定义

1.2.1.定义格式

继承概念中的例子,我们看到Person是父类,也称作基类。Student是子类,也称作派生类。下图就是继承的定义格式:

如下图所示,继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。

我们使用监视窗口查看Student和Teacher对象,可以看到变量的复用。调用Print可以看到成员函数的复用。可以看出派生类继承基类,不仅继承了基类的成员变量,也继承了基类的成员函数。

1.2.2.继承关系和访问限定符

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

类成员/继承方式
public继承
protected继承
private继承
基类的public成员
派生类的public成员
派生类的protected成员
派生类的private成员
基类的protected成员
派生类的protected成员
派生类的protected成员
派生类的private成员
基类的private成员
在派生类中不可见
在派生类中不可见
在派生类中不可见
总结:
1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的 不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2. 基类private成员在派生类中是不能被访问, 如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
可以看出protected/private成员对于基类是一样的,类外面不能访问,类里面可以访问;protected/private成员对于派生类, private成员不能用,protected成员类里面可以用。
3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。
4. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过 最好显示的写出继承方式。
5. 在实际运用中父类成员基本都是保护和公有,继承方式基本都是公有继承,几乎很少在父类里面用私有和使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

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

\bullet  派生类对象可以赋值给基类的对象 / 基类的指针 / 基类的引用(向上转换)。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。
派生类对象赋值给基类的对象:相当于是把派生类中基类那部分切来赋值过去,如下图所示
派生类对象赋值给基类的引用:相当于基类引用了派生类中属于基类的部分,如下图所示

派生类对象赋值给基类的指针:相当于指针指向了派生类中属于基类的部分(准确的说是指向派生类中属于基类部分的首字节地址),指针解引用出来的也是派生类中属于基类的部分,如下图所示

注:子类对象赋值给父类的对象/指针/引用,语法天然支持,没有类型转换,不产生临时对象,所以下面的代码中可以Person& rp=s不需要加const。

 

\bullet  基类对象不能赋值给派生类对象。
\bullet  基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。这里基类如果是多态类型,可以使用RTTI(Run-
Time Type Information)的dynamic_cast 来进行识别后进行安全转换。(ps:这个我们后
面再讲解,这里先了解一下)

 

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

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

相关文章

记一次艰难的上班历程

我是卢松松,点点上面的头像,欢迎关注我哦! 以下事件均为卢松松真实经历: 早上7点,小区又被静默了,几百号人堵在小区门口。 我不顾病毒传染的风险挤到了小区门口,问原因。 看门的说到&#x…

pumping lemma

正规语言版本 LLL是正规语言,则存在整数p≥1p\ge 1p≥1 对于任意长度大于等于ppp的字符串w∈Lw\in Lw∈L,wxyzwxyzwxyz,满足下面3个条件 ∣y∣≥1\left|y\right|\ge 1∣y∣≥1 ∣xy∣≤p\left|xy\right|\le p∣xy∣≤p ∀n≥0,xynz∈L\forall n\ge 0,xy^nz\in L∀n≥…

1997-2020年各省三废排放量和熵值法计算的环境规制综合指数(无缺失值)

1997-2020年各省三废排放量和环境规制综合指数 1、包括:30个省份 2、指标包括:工业二氧化硫排放量、工业烟尘排放量和工业废水排放量 环境规制综合指数是由工业废水排放量、工业 SO2 排放量以及工业烟尘排放量计算而来 (表格中有详细的三…

网络流量监测与调度技术研究

网络流量监测与调度技术研究网络流量监测与调度技术研究学习目标:流量监测学习内容:流量监测流量监测的设计框架框架一框架二框架三申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计…

零基础上手unity VR开发【Oculus账号体系准备】

📌个人主页:个人主页 ​🧀 推荐专栏:Unity VR 开发成神之路 --【着重解决VR项目开发难,国内资料匮乏的问题。从零入门,一步一个脚印,带你搞定VR开发! 😻😻】 &#x1f4d…

大数的乘法

输入一个大正整数和一个非负整数,求它们的积。 输入格式: 测试数据有多组,处理到文件尾。每组测试输入1个大正整数A(位数不会超过1000)和一个非负整数B(int范围)。 输出格式: 对于每组测试,…

[Leetcode刷题] - LC003 Longest Substring without repating character

题目链接 Leetcode 003Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题目描述 给定…

数字先锋 | 随时随地云端阅片,“云胶片”时代来啦!

作为现代医疗必不可少的诊断方法,医学影像数据在医疗数据中的占比高达90%且正以每年30%的速度递增,而影像医生就业人数年增长率仅4%。这意味着,全国总人数不到20万的放射科医生,要处理每年75.4亿人次影像相关诊断需求,…

代理模式-P19

静态代理: 创建项目: Rent package com.Li.demo01;//租房 public interface Rent {public void rent(); }Proxy: package com.Li.demo01; //中介(负责找房东) public class Proxy implements Rent{//private Host h…

Redis安装及使用(WindowsLinux)

Windows 1.下载 下载地址:Releases tporadowski/redis GitHub。 目前最新5.0.14 2.解压 3.先后打开redis-server.exe和redis-cli.exe两个文件(一定要按顺序) 4.使用 正常使用在redis-cli.exe里面输入各种命令(使用期间redis…

7、系统管理

文章目录7、系统管理7.1 Linux 中的进程和服务7.2 service 服务管理(CentOS 6 版本-了解)7.2.1 基本语法7.2.2 经验技巧7.2.3 案例实操(1)查看网络服务的状态(2)停止网络服务(3)启动…

基于JAVA的个人博客论坛系统的设计与实现参考【数据库设计、源码、开题报告】

在学校开发搭建一个什么项目最有成就感,那肯定就是搭建「个人博客」呀,然后把自己平时的学习笔记写到博客里,这时你的笔记就是**云笔记**,就再也不会出现因为本地文件丢失而感到痛心的事情。 而且,还可以把你的个人博客…

艾美捷小鼠肿瘤坏死因子α-ELISpot试剂盒使用说明

肿瘤坏死因子-α 肿瘤坏死因子-α(TNF-α,也称为TNF-α、TNF-a、TNF-a和肿瘤坏死因子α)由许多不同的细胞类型产生,例如单核细胞、巨噬细胞、T细胞和B细胞。TNF-α的许多作用包括保护细菌感染、细胞生长调节、免疫系统调节和感染…

Kotlin 使用vararg可变参数

文章目录背景Kotlin中使用可变参数对Kotlin可变参数反编译资料背景 一般在项目开发中,我们经常会在关键节点上埋点,而且埋点中会增加一些额外参数,这些参数通常是成对出现且参数个数是不固定的。如下: //定义事件EVENT_ID const…

云原生|kubernetes |使用Prometheus监控k8s cAdvisor篇(一)(centos)

前言: 为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数,比如,某个pod的内存使用异常高企 等等这样的异常状态(虽然kubernetes有自动重启或者驱逐等等保护措施,但万一没有配置或者失效了呢)&am…

PAM exec模块监控服务器ECS登录用户及IP,触发登录后,发送至钉钉

PAM 模块pam_exec ,用于运行外部命令 PAM 项作为环境变量导出:* PAM_RHOST , PAM_RUSER , PAM_SERVICE , PAM_TTY , PAM_USER 和 PAM_TYPE *,其中包含以下模块类型之一:account&…

【深度学习】实验5布置:滴滴出行-交通场景目标检测

DL_class 学堂在线《深度学习》实验课代码报告(其中实验1和实验6有配套PPT),授课老师为胡晓林老师。课程链接:https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

电脑c盘分区太小如何可以扩大,电脑c盘不够用了,如何给电脑分区

C盘是很重要的系统盘,会影响到整个系统的正常化运行。如果电脑c盘分区太小如何可以扩大? 一、清理C盘的垃圾文件 C盘分区不足的原因之一就是因为C盘的垃圾文件没有及时清理,导致垃圾文件越来越多,电脑越来越卡,所以&a…

2022最新软件测试面试八股文,全网最全最新,堪称地表最强

前言 2022秋招已经结束,在应聘过程中相信很多同学都感受到了目前测试就业越来越严峻,内卷也成了测试领域的代名词了。的一个HR朋友告诉我,由于门槛较低,现在普通测试岗(偏功能)的投递比已经将近100&#x…

如何让皮卡丘在网页上跑起来

说在前面 🎈相信很多80、90后的朋友,对QQ宠物印象非常深刻,每次开机宠物就会自动跑出来。曾经很多人想饿死他,但失败了;也有很多人一上线就退出,但就是不愿因取消“开机自动开启”的勾选。2018年09月15日&a…