1.继承与派生的概念
有的时候我们会遇到一个类中包含了很多已经声明过的类中的成员,这个时候就不想再去重新声明。就像是我们声明了一个马的类,我们还想声明一个公马的类,我们希望只加入性别这么一个成员变量,而其他马的性质可以通过继承已经声明过的马的类。一个新类从已有的类中获得自己已有的特性叫做类的继承。从已有的类(父类)产生一个新的子类称为类的派生。
可以理解到:派生类是比基类更加具体的,而基类的派生类的抽象。
2.派生类的声明方式
声明派生类的一般格式是:
class 派生类名 : 继承方式 基类名
{
派生类新增加的成员;
};
继承方式包括:public,private,protected。继承方式是可以选择的,如果不写此项默认为private
3.派生类的构成
派生类中的成员包括从基类继承过来的成员和自己新增加的成员。从基类继承过来的成员体现了派生类从基类继承而获得的共性,而新增加的成员则体现了派生类的共性。
事实上并不是把基类成员跟派生类新增加的成员简单的加载一起的。构造一个派生类有三个步骤:
1.从基类接收成员:派生类把基类的全部成员接收过来(不包括构造函数跟析构函数),也就是说是没有选择的,是全部的接收。这样有可能会造成数据的冗余,这个目前c++标准中是无法解决的,但是一般在设计基类时都会做好充分的考虑。
2.调整从基类接受的成员:接收基类的成员是程序人员无法选择的,但是可以对这些成员做一些调整。通过继承方式调整基类成员在派生类中的访问属性。此外可以在派生类中中声明一个跟基类成员同名的成员,派生类的新成员会覆盖基类成员。
3.在声明类时增加的的成员:这部分应该慎重的考虑,很重要。
4.派生类成员的访问属性
对于派生类成员的访问属性主要分成对于基类成员的访问属性跟对于派生类新增成员的访问属性。
首先对于新增成员的访问属性跟一般的类没有区别。
对于基类成员的访问属性跟继承方式有关:
首先应该明确对于基类的私有成员只能在基类中访问,不能在外部访问,不管用什么方式继承,基类私有成员都是无法访问的。(但是这不意味着没有继承)但是对于基类的保护成员,在派生类中是可以访问的,但是不能类外访问,这就是protected跟private的区别。
1.如果以private的方式继承:那么会将基类中的public跟protected的成员以private的方式加入派生类。也就是说可以在派生类中访问,但是不能在类外访问。
2.如果以protected的方式继承:那么会将基类中的成员以protected的方式加入派生类。
3.如果以public方式继承:是不改变基类成员的访问属性的。
5.多级派生时的访问属性
跟一级派生是一样的,就是如果a派生出b,那么a类中的成员通过某一种继承方式适应到了b类,注意这个继承之后成员是属于b类了,就是说在b类中有自己的访问属性,那么在通过b派生出c也是同样的道理,c是继承于b的,跟a是没有关系的。
6.简单派生类的构造函数跟析构函数
派生类的构造函数的一般形式:
派生类构造函数函数名(总参数列表):基类构造函数(参数列表)
{
派生类中新增成员的初始化语句;
}
对于基类构造函数的参数列表是没有数据类型的,因为这里不是定义基类的构造函数,而是调用基类的构造函数,放的是实参而不是形参。请注意:在类中对派生类构造函数声明的时候,不包括基类的构造函数及其参数列表。只在定义函数时将他们列出来。
再建立一个派生类对象时,先调用基类的构造函数,在调用派生类本身的构造函数。
在派生类对象释放的时候先调用派生类的析构函数,在执行基类的析构函数。
7.有子对象的派生类的构造函数
新构造函数的形式:
派生类构造函数名(参数列表):基类构造函数(参数列表),子对象名(参数列表)
{
派生类中新增成员的初始化语句;
}
执行顺序是:调用基类构造函数,对基类数据成员初始化。然后调用子对象构造函数,对子对象数据成员初始化。最后执行派生类构造函数本身,对新增派生类成员初始化。
派生类构造函数的总参数列表中的参数应当的包括基类构造函数和子对象的参数列表中的参数。基类构造函数跟子对象的次序是可以任意的,编译系统是根据参数名来确定传递关系的。
8.多层派生时的构造函数
比如说现在b继承于a,c继承于b,在写派生类c的构造函数的时候不用写a,只要写他的上一个基类(直接基类)b的构造函数,因为b的构造函数时包括了a的构造函数的。
9.派生类的析构函数
在派生类中可以根据自己的需求定义自己的析构函数,用来对派生类增加的新成员进行清理工作。基类的清理工作仍由基类的析构函数负责。在执行派生类的析构函数时,系统会自动调用基类的析构函数和子对象的析构函数。
10.多重继承
每一个继承用,隔开就好了,分别指明继承方式。
对于多重继承的构造函数也没什么区别,用,隔开即可。