一:基本概念
- 基类(父类):已有的类
- 派生类(子类):新建立的类
派生类是基类的细化,基类是派生类的抽象
二:派生类的声明方式
class 派生类名: private/public 基类名1, private/public 基类名2, ...{
private:
...;
public:
...;
};
基类名前的private/public叫基类存取限定符,分别是私有继承/共有继承
- 若基类前不加限定符,缺省为private
- 友元不能继承
派生类对象所占空间:基类数据成员所占空间总和 + 派生类数据成员所占空间的总和
派生类课访问的成员函数:
- 基类成员函数 + 派生类成员函数
- 继承基类的全部数据成员(不一定都可以访问)
- 继承基类除构造函数和析构函数外的全部成员函数(不一定都可以访问)
三:派生类的成员访问属性
公有派生:
- 基类的private成员被继承,但不可访问
- 基类的public成员被继承为派生类的public
私有派生:
- 基类的private成员被继承,但不可访问
- 基类的public成员被继承为派生类的private
注:不可访问是指不能被直接访问,但可以通过共有函数等形式间接访问
四:保护段与保护继承
- protected段的成员对外不可访问,对内可被任意访问(等同于private属性)
- protected段的成员继承后可被派生类访问
- protected被private继承后当做派生类的private
- protected被public继承后当做派生类的protected
- 基类的private成员被继承,但不可访问
- 基类的protected/public成员被继承为派生类的protected
五:派生类的成员访问属性(支配规则)
数据成员同名:
- 派生类屏蔽基类,通过直接访问的方式可访问派生类的成员,通过加类的作用域符号的方式可访问基类成员
成员函数同名:
- 不管参数的个数、类型是否完全相同:同数据成员同名处方式
六:派生类的构造函数和析构函数
构造函数的调用顺序:先基类,次子对象,后派生
若派生类的初始化表中不出现基类,则系统自动调用基类的无参构造函数
析构函数的调用顺序:与构造函数相反
七:多重继承
虚基类:针对某个间接基类被多次继承而产生的多个无名对象,从而导致派生类中有多份相同的数据成员拷贝的情况,引入虚基类,使相同基类只保留一份数据成员
八:基类与派生类的转换(赋值兼容规则)
赋值兼容规则:
- 在需要基类对象的任何位置,都可以使用公有继承的派生类对象
- 使用时,将派生类中的基类无名实例对象对应空间拷贝给基类,其余部分丢弃
- 当基类中包含动态申请内存时,赋值兼容规则可能会出错
"任何位置"主要包括:
- 派生类对象可初始化基类的对象或引用
- 派生类对象可出现在函数参数/返回值为基类的地方
- 派生类对象可赋值给基类
- 派生类对象的指针可出现在基类指针出现的位置