构造函数和析构函数都不能继承。
- 派生类的构造函数承担着对基类中数据成员初始化和对派生类自身数据成员初始化的双重任务。
- 派生类的析构函数应包含着基类的析构函数,用来释放基类中的数据成员
单继承
派生类构造函数的执行顺序如下
- 先执行基类构造函数;
- 再执行子对象的构造函数(如有子对象的话)
- 最后执行派生类构造函数的函数体
派生类构造函数的成员初始化列表中应该显式地包含基类中带参数的构造函数,或者隐含地包含基类中的默认构造函数
派生类析构函数的指向顺序如下
- 先执行派生类的析构函数
- 再执行子对象所在类的析构函数(如果有子对象的话)
- 最后执行基类中的析构函数
由于析构函数不能继承,因此在派生类的析构函数中要包含它的直接基类的析构函数
多继承:
多继承的构造函数和析构函数
- 在多重继承派生类构造函数中,先执行基类的构造函数。多个基类构造函数的执行顺序取决于定义派生类时规定的先后顺序,与派生类的成员初始化列表中顺序无关。
- 多重继承派生类的析构函数中隐含着直接基类的析构函数,但其执行顺序与构造函数相反
- 派生类构造函数中可以隐含着直接基类的默认构造函数。
多继承的二义性
- 调用不同基类中的相同成员可能会出现二义性
要在调用的函数前加上类的域。<类名>::<函数名>
来调用函数一避免二义性。
虚基类
- 用于有共同基类的场合。
- 用
virtual
修饰符来说明。
作用
- 主要用来解决多继承时可能发生的 对同一基类多次继承 而产生的二义性问题。
- 为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝。
即在派生类中调用的成员是直接调用的虚基类中的。
在第一次继承时就要将共同基类设计为虚基类
当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。
注意:为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。
含有虚基类的派生类的构造函数
- 建立对象时所指定的类称为最(远)派生类。
- 虚基类的成员是由最(远)派生类的构造函数通过调用虚基类的构造函数进行初始化的。
- 在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员初始化表中给出对虚基类的构造函数的调用。
- 在建立对象时,只有最(远)派生类的构造函数调用虚基类的构造函数。