C++继承和多态特性——继承详解(1)

一、什么是面向对象的继承特性

1、类的继承案例

(1)基类为:person,派生类为man,所有权限均为public

(2)演示:派生类“继承”了基类的成员变量、成员方法,共包含5个文件,main.cpp、man.cpp、man.hpp、person.cpp、person.hpp,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)C++类的继承语法如下:

class 派生类名:访问控制(继承的权限描述) 基类名1,访问控制 基类名2,访问控制 基类名n
{
	// 成员变量和成员方法列表(除了构造和析构之外的成员方法)
};

2、什么是继承

(1)继承是C++源生支持的一种语法特性,是C++面向对象的一种表现

(2)继承特性可以让派生类“瞬间”拥有基类的所有(当然还得考虑权限)属性和方法

(3)继承特性本质上是为了代码复用(在C语言中可以通过结构体变量中包含结构结构体变量来实现)

(4)类在C++编译器的内部可以理解为结构体,派生类是由基类成员叠加派生类新成员得到的

3、继承特性是天然的

(1)天然的意思就是:符合现实世界的本质规律,而不是纯粹人为施加的。

(2)继承inheritance和组合composition是软件重用的2种有效方式

(3)派生类,范围小,具体。 基类,范围大,抽象

(4)派生类又叫子类,基类又叫父类。两种叫法都有人常用,我们后面会混用,锻炼大家瞬间了然的能力

二、C++继承中的权限管控

1、C++类中的访问权限管控

(1)public 类内部可以访问,类的外部可以访问

(2)private 类内部可以访问,类的外部不能访问

(3)protected 类内部可以访问,类的外部不能访问

2、继承时的三种权限设置对派生类的影响

(1)public继承(公有继承):父类成员在子类中保持原有访问级别

(2)private继承(私有继承):父类成员在子类中变为private成员

(3)protected继承(保护继承):父类中public成员会变成protected,父类中protected成员仍然为protected,父类中private成员仍然为private

(4)如果继承时不写则默认情况下派生类为class时是private继承,而派生类为struct时是public继承

3、设计类时如何规定成员的访问权限

(1)需要被外界访问的成员直接设置为public

(2)只能在当前类中访问的成员设置为private

(3)只能在当前类和子类中访问的成员设置为protected。

总结:
(1)父类的public成员,经过public继承后,在子类中是public的。

(2)父类的private成员,经过public继承后,在子类中是比private还可怜的。意思1是这个成员在子类中是存在的,意思是它不能被直接访问(子类的成员方法),怎么能访问?
  只能通过子类从父类继承而来的父类里实现了的成员函数来间接访问。此时使用的父类实现的函数以及访问的父类继承的成员变量都是子类中继承过来的,并不属于父类,都是子类的。

(3)父类的protected成员,经过public继承后,在子类中是protected的。意思就是该成员在子类中是子类内部成员可以访问,子类对象外部不可以访问,子类再次去继承产生孙类中他还是protected的。

(4)public继承,对于父类中public和protected成员的权限在子类中,其实是没有增强也没有削弱的;但是对于父类中private成员,其实在子类中是有削弱的(比private还可怜)

(5)如果是private继承,那么父类中的public成员和protected成员就变成了子类中的private成员,父类中的private成员成了子类中比private还可怜的那种成员。

(6)如果是protected继承,那么父类中的public成员和protected成员就变成了子类中的protected成员,父类中的private成员成了子类中比private还可怜的那种成员。

进一步总结:

1、父类的private成员,在三种继承下都会变成在子类中是比private还可怜的这种成员

2、父类的public成员,在public继承下到子类中还是public,在protected继承下到子类
中是protected的,在private继承下到子类中是private的。

3、父类的protected成员,在public继承下到子类中是protected的,在protected继承下
到子类中是protected的,在private继承下到子类中是private的。

4、private:如果是父类中的private权限成员,那么在继承时会被降到比private还惨的
这种;而如果是private继承,则不会导致父类中public和protected的成员降权到比
private还惨的这种,只会降级到private权限。

5、在继承中父类中所有的成员(不管哪种权限)都会被继承给子类,而不会丢失任何一个。
父类中的成员继承到子类后的权限简单记忆方法:继承权限和继承的权限那个惨用哪个,即那
个更严格用那个。
eg:继承权限:class person:public
   继承的权限:protected
   父类中的成员继承到子类后的权限:protected

三、继承体系下子类和父类的关系

1、本质上是2个独立的类

(1)继承只是通过父类来快速构建子类的一种语法技术,继承后得到的子类和父类是独立的2个类

(2)程序中子类的对象和父类的对象是2个独立的对象,没有任何关系,只是形成对象的模板有部分相同

(3)子类对象中访问的子类从父类继承而来的成员,其实是属于子类自己的,并不是父类(对象)里面的

2、站在子类角度看继承

(1)非继承体系下的类,完全是自己“手工”构建的,所有成员根据访问权限不同而分为1个层级3大块(逻辑上)

(2)继承体系下的子类,部分直接从父类继承,部分自己手工打造,所有成员分成2个层级(继承来的,自己写的),每个层级3大块(访问权限)

(3)继承就是子类在构建自己的过程中使用的一种快速批量成员获取方法而已

3、为什么父类private成员在子类中还有

(1)思考:父类的所有成员在子类中都必须有吗?有没有可能父类有一个成员其实子类没必要具备的?

  1、不一定;2、有可能

(2)思考:如何做到在继承时让程序员指定父类的哪些成员参与继承,哪些不参与?

  可以通过某个关键字实现。但是C++并没有这么做,他选择了全继承。

(3)选择:继承就是父类所有成员全部按分类规则传给子类

4、为什么父类private成员在子类中还有但不能直接访问

(1)思考:这个规定是天然的,还是人为规定的?其实是:人为规定的。 因为:访问权限这一套本身就是人为的

(2)为什么这样设计1:如果能直接访问,那就打破了父类private的含义(父类私有),破坏了class的封装性

(3)为什么这样设计2:父类的private成员在子类中很大可能本来就不需要去访问,所以能直接访问反而有风险,没必要

(4)为什么这样设计3:间接访问合乎一个原则:在哪里定义的成员变量在哪里操作。子类和父类不是一个人写的时尤其要这样,避免问题

(5)这也是一个如何选择的设计哲学问题。

注:本文章参考了《朱老师物联网大讲堂笔记》,并结合了自己的实际开发经历以及网上他人的技术文章,综合整理得到。如有侵权,联系删除!水平有限,欢迎各位在评论区交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小嵌同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值