c++ - 第13节 - c++中的继承
创始人
2024-02-09 02:22:49
0

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:这个我们后 面再讲解,这里先了解一下)

 

相关内容

热门资讯

个性网名大全 个性网名大全  个性网名大全(精选500个)  在网络上有一个网名是不是也更能吸引网络好友呢?不试试...
一辈子不用改的个性签名 一辈子不用改的个性签名  随着社交网络开始流行,越来越多人会在社交平台上发布个性签名,个性签名是传播...
伤感的个性签名 关于伤感的个性签名15篇  随着社交网络的快速发展,越来越多人钟情于在社交平台上不定时地更换个性签名...
适合长期不换的网名 适合长期不换的网名  期待一个好名字的出现,能够让自己用一辈子不换,长情有时候也没什么不好,只要你遇...
曲终人散的个性签名   曲终人散的个性签名  1、不简单的简单爱,不吵闹的小吵闹。  2、如果你不懂我的沉默,你也永远不...
脑卒中防治知识讲座 脑卒中防治知识讲座脑卒中防治知识讲座一、什么是脑卒中脑卒中(Stroke)是脑中风的学名,是一种突然...
抖音上很火的个性签名 抖音上很火的个性签名  随着社交网络的迅猛发展,越来越多人习惯于在线上发布自己的个性签名,借助个性签...
法师名字500个 法师名字500个  名字类别  从历史的习俗沿革来看,名有乳名、本名、学名、曾用名、笔名、艺名等之分...
正确养殖签名树 正确养殖签名树  在国签名树内作为盆栽不是很多,所以有关签名树的养殖方法的资料也相对匮乏,但是这并不...
英文男网名 英文男网名  英文男网名(精选300个)  男生一般会选用个性的、霸气的网名,而有一些男生也比较喜欢...
抖音最吸引人的网名大全 抖音最吸引人的网名大全  抖音最吸引人的网名(精选600个)  大家在选择自己的抖音网名的时候,往往...
浪漫网名大全 浪漫网名大全  网名指在网上使用的名字。由于网络是一个虚拟的世界,为了避免使用真实姓名带来的麻烦所以...
情侣签名唯美句子精选485句 情侣签名唯美句子 精选57句1. 有事给我打电话,没事也给我打电话。2. 很多事,不是我想,就能做到...
2015句子签名大全精选34... 2015句子签名大全 精选73句1. 明知道谁都离不开谁,却偏偏要互相折磨。2. I will al...
工业循环水水质分析 工业循环水水质分析工业循环水水质化验项目及方法循环冷却水 PH 值的测定方法方法:PH 计直接测定 ...
简单气质个性签名女生   我这一生要走多远的路程,什么时候才能停下,简单气质个性签名女生。下面是unjs小编为大家分享有关...
诗意的帮派名字300个 诗意的帮派名字300个  好名字的好处  在易经预测体系里,影响我们人生运势的有风水、数字、名字。名...
中考激励自己的座右铭 中考激励自己的座右铭  1、师生共同努力,成就六月辉煌。  2、沉着冷静,周密思考,认真严谨,仔细答...
人生哲理箴言签名 人生哲理箴言签名  人生不必求全责备,有道是:自古人生最忌满,半贫半富半自安!半命半天半机遇,半取半...
女孩取名内涵诗意名字 女孩取名内涵诗意名字  女孩取名内涵诗意名字  名字是指人或者产品、物体的名称,姓名有广义与狭义之分...