继承
构造函数,析构函数都不能继承
派生类的析构函数应包含基类的析构函数,用来释放基类中的数据成员
派生类构造函数的执行顺序:基类构造函数,子对象的构造函数,派生类的构造函数
派生类析构函数的执行顺序:派生类析构函数,子对象析构函数,基类析构函数
派生类的三种继承方式
不同的继承方式:
- 影响派生类成员对基类成员的访问权限
- 影响派生类对象对基类成员的访问权限
公有继承:
基类 | 派生类 |
私有 | 私有 |
保护 | 保护 |
公有 | 公有 |
保护继承:
基类 | 派生类 |
私有 | 私有 |
保护 | 保护 |
公有 | 保护 |
私有继承:
基类 | 派生类 |
私有 | 私有 |
保护 | 私有 |
公有 | 私有 |
子类型:
当一个类型至少包含了另一个类型的所有行为,则称该类型是另一个类型的子类型。比如在公有继承下,派生类是基类的子类型。
类型B适应于类型A:类型B是类型A的子类型,类型B的对象就是类型A的对象。
赋值兼容规则
多继承
class C:public A,public B{
...
};
基类构造函数执行顺序是定义派生类时规定的先后顺序。
多继承的二义性:
调用不同基类中的相同成员时可能产生二义性;
当派生类的几个基类有共同的基类时。
虚基类
用于有共同基类的场合。
以virtual修饰说明虚基类
class A:virtual public B{
...
};
主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题