C++ 继承与派生

时间:2022-08-06 19:28:18

一、继承方式

公有继承
基类中公有成员和保护成员访问权限不变,私有成员变为不可访问。
私有继承(默认)
基类中公有成员和保护成员变为私有成员,私有成员变为不可访问。
保护继承
基类中公有成员和保护成员变为保护成员,私有成员变为不可访问。

综合:私有成员全都变成不可访问。公有继承不改变访问权限,私有继承和保护继承都是将基类中公有成员和保护成员变成继承方式所对应的权限。

二、构造和析构顺序

对单继承:
  创建派生类对象时首先调用基类的构造函数,然后再执行派生类的构造函数
  释放派生类对象时首先析构派生类的析构函数,然后再执行基类的析构函数
对多继承:
  调用基类的构造顺序按照继承时说明的顺序,而不是派生类构造函数中列举的顺序
  C++ 继承与派生
对于有子对象类,派生类的构造函数初始化列表中,不仅需要调用基类构造函数,还需要调用子对象的构造函数,按照以下顺序:
  1、调用基类构造函数,按照继承顺序
  2、调用子对象类的构造函数,按照说明顺序
  3、调用派生类构造函数

当基类有默认函数或者没有定义构造函数时,派生类中无需调用
当基类构造函数使用一个或多个参数,必须在派生类中定义构造函数

三、冲突与支配

派生类中没有而派生类的多个继承基类中有同名函数,在派生类对象调用该函数时需要加作用域运算符:
  C++ 继承与派生
  C++ 继承与派生
如果基类和派生类中有同名函数,那么派生类中函数将具有支配地位,称为同名覆盖。如果没有作用域运算符调用派生类函数,如果有,调用基类函数。

四、虚基类

C++ 继承与派生
为避免出现上面有图类D由于多继承,出现两份相同类A的成员函数。在继承时使用virtual解决这个问题:
C++ 继承与派生
C++ 继承与派生

注意:
在派生类的初始化列表中必须列出虚基类的构造函数,如未列出,表示使用基类默认构造函数;
在初始化列表中,如果同时出现虚基类和非虚基类构造函数,将先调用虚基类构造函数
只有创建对象的派生类才会调用虚基类的构造函数,其他派生类并不会调用虚基类构造函数。保证其只被调用一次