因为派生类不继承基类的构造和析构函数,为了对派生类新增的成员初始化,或扫尾、清理,需要加入构造和析构函数。
一、构造函数
派生类成员对象有所有基类的成员对象与派生类新增成员对象组成,在构造派生类的对象时,要对其所有成员对象初始化。
为了完成这些工作必须添加新的构造函数,对新增加成员对象初始化,并通过调用基类构造函数,完成对不能直接访问的基类成员对象初始化。
syntax:
派生类名::派生类名(参数表):基类名1(基类1初始化参数表),…,基类名n(基类n初始化参数表),成员对象名1(成员对象1初始化参数表),…,成员对象名m(成员对象m初始化参数表)
{
派生类构造函数其他操作;
}
参数表:给出初始化基类数据和新增加成员对象所需数据。
基类名1~n:
需要基于参数初始化(构造函数带有形参表)的基类(对于使用默认构造函数的基类,可以不给出类名)
派生类构造函数执行次序
1)调用基类构造函数,顺序按照继承时声明顺序(from left to right);
2)对派生类新增成员对象初始化,按照类中声明顺序;
3)执行Function body。
二、复制构造函数
类似于构造函数,基类的复制构造函数也是不能被派生类继承的
if不使用默认构造函数,则要为派生类编写复制构造函数,这个函数还要为基类相应的复制构造函数传递参数。
syntax:
DerivedClassName : : DerivedClassName (DerivedClassName &v) : BaseClassName(v) ,…, { … }
虽然v为派生类对象的引用,但根据类型兼容机制,依然可以用派生类的对象去初始化基类的引用。
三、析构函数
因派生类是不会继承基类的析构函数的,那为了对派生类新增的非对象成员清理,必须编写派生类的析构函数,需要注意的是析构函数只要负责把派生类新增的非对象成员清理就好了,系统会调用基类的析构函数清理从基类继承而来的成员。
清理工作顺序:
1)执行派生类机构函数体;
2)清理派生类成员新增成员;
3)调用基类析构函数,清理从基类继承而来的成员,清理顺序与被继承时声明时的顺序相反。