面向对象编程:继承(C++)

面向对象编程:继承(C++)

一、简介

1、继承是软件重用的一种方式,程序员通过继承,可以吸收现有类的数据和行为来创建新类。

2、几个概念:

1、直接基类:现有的类称为基类,派生类可以由基类继承而来。
2、间接基类:通过两级或更多级类层次继承的类
3、单继承:派生类由继承一个基类而得到。
4、多继承:派生类由多个类继承而来。

3、三种继承方式

1、公有继承:每个派生类的对象也是基类的对象,但是基类对象不是派生类对象。
2、私有继承:某些情况下,private继承可作为组成的另一种形式。
3、受保护继承。

派生类成员函数不能访问基类的私有成员

4、
(1)is - a 关系表示继续

派生类的对象都可以看成是基类的对象。
(2)has - a 表示组成
一个对象可以把其他类的一个或多个对象拿来作为己有的成员。

二、基类和派生类

1、一个基类可以有多个派生类。
在这里插入图片描述
2、公有继承:任何一种继承中,基类的私有成员在派生类中都不能被访问,但是这些私有成员仍然被继承了;在public继承中,基类的所有其他成员在成为派生类的成员时仍保持了原始的成员访问权限。

友元函数是不能被继承的 。

三、protected成员

基类的protected成员可以在基类的体内被基类的成员和友元访问,也可以由基类所派生出的任何类的成员和友元访问。

四、基类和派生类之间的关系

1、从一个类向另一个类复制粘贴代码,可能造成错误 在多个源文件中扩散。当我们想要一个类“吸收”别的类的数据成员和成员函数时,使用继承而不是“复制粘贴”手段,从而避免代码的复制。
2、使用继承时,类的层次中所有类的共同数据成员和成员函数在基类中声明。需要对共同的特征修改时,只需要在基类中修改。于是派生类也就继承了相应的修改。如果不采取继承机制,则需要对所有包含代码拷贝的源文件进行修改。
3、使用成员初始化器显示调用基类的构造函数,可以避免重复初始化。如果没有显示调用基类的构造函数,C++将尝试隐式调用基类的构造函数,再在构造函数初始化数据就重复初始化了。

五、派生类中的构造函数和析构函数

1、基类构造函数------派生类成员初始化器------派生类构造函数的函数体
2、基类对象的构造函数------基类的构造函数------派生类对象的构造函数------派生类构造函数。析构函数调用顺序与构造函数相反。
3、派生类不继承基类的构造函数、析构函数和重载的赋值运算符函数。派生类的构造函数、析构函数和重载的赋值运算符函数可以调用基类的构造函数、析构函数和重载的赋值运算符函数。

六、总结

继承的使用方式和相关注意点:
(一)、私有数据是private型的继承:
1、基类在派生类的类名后面写出:

class A :public B//A是派生,B是基类,被公有继承

2、派生类的构造函数里面的参数值一定要给够,包括基类里面的参数。因为在派生类的构造函数会调用基类的构造函数。

注意:在这种情况下在派生类的函数实现中直接使用基类的私有数据成员会报错。

(二)、私有数据是protected型的继承:
解决了直接使用私有数据成员报错的问题,利用protected下的私有数据成员后直接使用私有数据成员不会报错。

注意:这种情况下也有不便之处,就是如果在基类中的私有数据成员写错了,要修改时要进行基类和派生类的成员共同修改。我们想要达到的效果是直接修改基类中的信息,派生类就跟着被修改,这就是下面一种方式。

(三)、私有数据是private型的继承:
这种方式的做法:
(1)、在基类中要用到私有数据成员时,用它的接口函数代替。
(2)、在派生类中使用基类的接口函数时,如果该接口函数在基类和派生类中有同样的函数名时,在调用它的时候一定要在函数名前加上基类的类名+二元作用域运算符。

*代码中学到的一个继承知识点:

在这里插入图片描述
代码问题描述:对象的赋值,要在同种类型下进行,那么为什么第一个框不在同种类型下不会报错,而第二个框就会报错。

解释:
子类是在父类的基础上扩展的,从某种意义上来说子类的内存信息量要大于(至少是不小于)父类的内存信息量(在父类的内存信息上增加信息)
所以
父类变量=子类变量,因为父类变量的内存信息少,把子类的内存空间缩小后赋给父类变量,不会造成内存越界(本来就属于子类的内存空间,怎么缩小也还是在合法的内存空间),所以没问题
子类变量=父类变量,因为子类变量的内存信息多,把父类的内存空间扩大后赋给子类变量,会造成内存越界(扩大到本来不属于父类的内存),所以有问题

解决方法一:类型强行转换进行赋值操作
解决方法二:赋值运算符重载

发布了10 篇原创文章 · 获赞 227 · 访问量 4002

猜你喜欢

转载自blog.csdn.net/m0_46518461/article/details/105503483
今日推荐