第十一章 继承和派生
1.单继承(子类只有有一个父类)&多继承(子类有多个父类)
2.派生类的声明方式
class 派生类名 :继承方式 基类名
{
派生类新增加的成员
};
3.继承方式:
Public:(公有)
Private:(私有)
Protect:(保护)
4.派生类的构成:
从基类接收成员:(除构造和析构以外的所有成员)
调整从基类接收的成员:(改变访问属性)
对于新增同名成员函数:
如果参数列表相同:派生类覆盖基类
如果参数列表不同:函数重载
在声明派生类时增加的成员:(对基类的具体化)
5.派生类成员的访问属性
Public: 基类保持原有的访问属性
基类在派生类外可见,可以在类外引用基类公有成员;
Public->public
Private->不可访问
Protect->protect
Private:基类的公有成员不能在基类和派生类外被访问
基类在派生类外不可见;
Public->private
Private->不可访问
Protect->private
Protect:不能被类外引用,可以被派生类的成员引用
基类在派生类外不可见,其下一层派生类可访问;
Public->protect
Private->不可访问
Protect->protect
不可访问:*派生类成员函数不能直接访问基类私有成员;
6.多级派生的访问属性:只看上一级成员属性确定
7.派生类的构造函数和析构函数
(在执行派生类的构造函数时,调用基类的构造函数)
*一般派生类的构造函数
派生类构造函数名(总参数列表):基类构造函数名(参数表){
派生类新增数据成员初始化;
}
总参数列表:同时包括基类和派生类的参数(同时包括参数类型)
*使用初始化列表:
参数表:调用基类构造函数(不加参数类型)
派生类构造函数名(总参数列表):基类构造函数名(参数表),新增数据成员(参数){};
*有子对象的派生类的构造函数
派生类构造函数名(总参数列表):基类构造函数名(参数表),子对象名(参数表){
派生类新增数据成员初始化;
}
*多层派生时的构造函数
(先构造基类,再构造子对象,最后构造派生类新增成员)
(不要列出每一层的派生类的构造函数,只需写出其上一层派生类的构造函数即可)
*派生构造函数的特殊形式
当不对派生类新增数据成员进行任何特殊初始操作,派生类构造函数的函数体为空。
如果基类没有定义构造函数,或者定义了没有参数的构造函数,那么派生类可以不写基类的构造函数,此时调用默认构造函数
析构函数:(先析构派生类新增成员,再析构子对象,最后析构基类)
8.多重继承
*声明多重继承的方法
Class 派生类名 :<继承方式> 基类1名, <继承方式> 基类2名,......
{
新增成员数据初始化;
}
*多重派生类的构造函数
派生类构造函数名(总参数表) : 基类1构造函数(参数表),基类2构造函数(参数表)
{
派生类新增成员数据初始化语句;
}
*多重函数的二义性
9.虚基类(在继承简洁共同记录是只保留一份成员)
*虚基类声明方法
Class A
Class B : virtual <继承方式> A
Class C : virtual <继承方式> A
注意:虚基类并不是在声明基类时声明的,而是在声明派生类,指定继承方式时声明
Class 派生类名 : virtual <继承方式> 基类名
*虚基类的初始化(使用初始化列表)
在最后的派生类中不仅要负责对其基类进行初始化,还要负责对虚基类初始化。
尽量避免使用多继承
10.基类和派生类的转换
只有公有继承能较好的保留了基类的特征,因此,只有共有派生类才是基类真正的子类型。
只能用子类对象对其基类对象赋值,而不能用基类对象对其子类对象赋值。
11.继承和组合
继承(派生类)是纵向关系,组合(复合类)是横向关系。