(1)派生类的访问属性
1)public继承:派生类中:可以访问基类的public和protect变量,不可以访问基类的private变量
派生类外:可以访问基类的public变量,不能访问基类的private变量
2)protect继承:派生类中:可以访问基类的public和protect变量,不可以访问基类的private变量
派生类外:都不可以访问
3)private继承:派生类中:都不可以访问
派生类外:都不可以访问
(2)派生类的构造函数
派生类中包含所有基类的数据成员和派生类中新增的数据成员(包括其他类的对象(子对象)和普通数据成员)。
1)对于基类成员和子对象成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以在构造函数体中进行。
2)派生类构造函数的初始化顺序:基类的构造函数,子对象的构造函数,派生类构造函数体。
3)当派生类中出现多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时声明的顺序(自左向右),而与派生类构造函数的成员初始化列表给出的顺序无关。
4)如果派生类的基类也是一个派生类,则每个派生类只需复杂其直接基类的构造,依次上溯。
5)当派生类中有多个子对象时,各个子对象的构造函数的调用顺序也取决于派生类宏定义的顺序(自前往后),而与派生类构造函数的成员初始化列表给出的顺序无关。
6)派生类构造函数提供将参数传递给基类构造函数的途径,以保证基类进行初始化时能够获得必要的顺序,如果基类的构造函数中定义了一个或多个参数,派生类必须定义构造函数。
7)如果基类定义了默认构造函数或根本没有定义一个构造函数,在派生类构造函数的定义中可以省略对基类构造函数的调用。
8)子对象的情况同7)基类。
9)当所有的基类或子对象的构造函数都可以省略时,可以省略派生类构造函数的成员初始化列表。
10)如果所有基类和子对象都不需要参数,派生类也不需要参数时,派生类构造函数可以不定义。
(3)派生类的析构函数
在派生时,派生类不能继承基类的析构函数,但是需要通过派生类的析构函数去调用基类的析构函数,析构函数的调用顺序与构造函数的调用顺序正好相反,首先调用派生类的析构函数,然后调用成员类对象的析构函数,最后调用基类的析构函数。
析构函数调用场景:
1)对象生命周期结束被销毁时(一般类成员的指针变量与引用都不自动调用析构函数)。
2)delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时。
3)对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。