一、继承概念
更加严格的继承规则应当是:若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,只是B类多了一些独有的特性,则允许B继承A的功能和属性。
继承的UML描述图:
单继承派生类的声明语法为:
class 派生类名: 继承方式 基类名
{
派生类新增成员的声明;
};
二、类的访问权限
•在类中,我们是设计师,public, private, protected三种成员可以访问
•在对象中,我们是使用者,只有规定的接口public才可以访问;protected, private不能访问
•私有成员(private):可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问
•公有成员(public):可以被任何普通函数和任何类的成员函数访问
•保护成员(protected):可以被类自身的成员和友元访问外,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问
三、三种继承方式的区别
四、继承执行顺序
(1)、构造函数的执行顺序
–先调用基类的构造函数初始化从基类继承的数据成员
–再执行自己的函数体初始化定义于派生类的数据成员
(2)、析构函数的执行顺序
–派生类的析构函数先执行自己的函数体
–再调用基类的析构函数
五、派生类到基类的转换
(1)、当派生类以Public方式继承基类时,编译器可自动执行的转换(向上转型 upcasting 安全转换)
–派生类对象自动转换为基类对象(特有的成员消失)
–派生类对象指针自动转化为基类对象指针
–派生类对象引用自动转化为基类对象引用
(2)、当派生类以private/protected方式继承基类时
–派生类对象指针(引用)转化为基类对象指针(引用)
需用强制类型转化
(基类&) 派生类对象
(基类*)派生类对象指针
(基类&) 派生类对象
(基类*)派生类对象指针
–不能把派生类对象强制转换为基类对象
(3)、基类对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而基类对象无法执行这类转换.
(4)、向下转型不安全,没有自动转换的机制
(5)、可以使用static_cast运算符进行强制类型转换,但仅限派生类以public方式继承基类.
六、多继承
(1)、多重继承—— 一个派生类可以有多个基类
–Class 类名: 继承方式 基类1,继承方式 基类2,…
.
{….};
{….};
–派生类同时继承多个基类的成员,更好的软件重用
–可能会有大量的二义性,多个基类中可能包含同名变量或函数
(2)、多重继承时派生类构造时,基类构造函数的调用顺序与派生类声明的继承顺序相同,而与成员初始化序列的顺序无关。而析构函数的调用顺序和构造函数的调用顺序相反。