继承
1.继承
从一个已有的类的基础上创建一个新类,新类包含了已有类的所有成员,并且还增添了自己的成员。
单重继承:生成的派生类只有一个基类
多重继承:生成的派生类有两个或两个以上的基类
(有的语言两种继承,如C++,有的语言只支持单重继承,如java,多重继承使用较少)
2.派生类
定义:
class <派生类名>:<继承方式> <基类名>
{
<派生类新增成员说明>
};
3.基类成员在派生类中的访问权限
不论哪种继承方式,派生类对象只能访问公有成员
4.派生类的构造函数
B(int i,int j,int k):A(i),aa(j)
{
b = k;
}
初始化列表中包括直接基类的构造函数、子对象、常数据成员
当派生类构造函数中包含基类中带参数的构造函数时,基类构造函数一定要显示的写在成员初始化列表中
当派生类构造函数中包含基类中默认构造函数时,该默认构造函数被隐含在派生类的构造函数中
派生类构造函数的执行顺序;
1)基类构造函数
2)子对象的构造函数
3)派生类的构造函数函数体
5.派生类的析构函数
5.派生类的析构函数
由于析构函数都是没有参数的,因此在派生类的析构函数中隐含着直接基类的析构函数
派生类析构函数的执行顺序
1)派生类析构函数的函数体
2)子对象所在类的析构函数
3)直接基类中的析构函数
析构函数执行顺序与构造函数执行顺序相反
如果存在多个子对象,析构子对象的顺序与定义子对象的顺序有关,先定义的后析构,后定义的先析构
6.子类型
定义:当一个类型至少包含了另一个类型的所有行为,则称该类型是另一个类型的子类型
在公有继下,派生类是基类的子类型
子类型关系不可逆
7.赋值兼容原则
当A是B的子类型,即A公有继承B时
1)A的对象可以赋值给B的对象
2)A的对象可以给B的对象引用赋值
3)A的对象地址值可以给B对象指针赋值
7.多重继承
定义:一个派生类有两个或两个以上的基类
class D:public A,public B,public C
{
...
};
多个基类构造函数的执行顺序取决于定义派生类时规定的先后顺序,与派生类的成员初始化列表中顺序无关
8.多重继承的二义性
1)调用不同基类中的相同成员时可能出现二义性
若两个相同的函数,一个出现在基类中,一个出现在派生类中,则派生类成员有支配基类成员的作用,故派生类成员有效
2)访问共同基类的成员时可能出现二义性
避免二义性的方法:类名限定
<类名>::<成员名>