派生类继承了基类的成员,实现了原有代码的重用,但是基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就需要加入派生类的构造函数。与此同时,对所有从基类继承下来的成员的初始化工作,还是由基类的构造函数完成的。
派生类构造函数和析构函数的执行顺序
通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数;当撤销派生类对象时,则先执行派生类的析构函数,随后再执行基类的析构函数。
派生类构造函数和析构函数的构造规则
派生类不能继承构造函数与析构函数,当基类的构造函数不含参数时,我们派生类可以不向基类传递参数(传递的参数用来初始化基类的成员。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。
在C++中,派生类构造函数的一般格式为:
派生类名(参数总表):基类名(参数表)
{
派生类新增数据成员的初始化语句;
}
其中基类构造函数的参数,通常来源于派生类构造函数的参数总表,也可以用常数。
说明:
1)可以将派生类构造函数定义在类的外部,而在类体内只写该函数的声明。
请注意:在类中声明派生类构造函数,不包括基类构造函数名及其参数表,只在类外定义构造函数时才将它列出来。
2)若基类使用默认构造函数或不带参数的构造函数,则在派生类中定义构造函数时可省略“:基类构造函数名(参数表)",此时派生类不需要构造函数,则可不定义派生类的构造函数。
当构造函数没有参数时,前面也有讲过,略。
3)当基类构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的构造函数哪怕只带有一个参数,它所有的派生类都必须定义构造函数,甚至所定义的派生类构造函数的函数体可能为空,仅仅起传递参数的作用。
派生类的析构函数
在派生类中可以根据需要定义自己的析构函数,用来对派生类数据成员的清理工作。基类的清理工作仍然由基类的析构函数负责。
析构函数的调用顺序与构造函数正好相反:先执行派生类的析构函数,再执行基类的析构函数。
含有对象成员(子对象)的派生类的构造函数
当派生类中含有内嵌的对象成员(也称子对象)时,其构造函数的一般形式为:
派生类名(参数总表):基类名(参数表0),对象成员名1(参数表1),……,
{
派生类新增成员的初始化语句
}
在定义派生类对象时,构造函数的执行顺序如下:
1)调用基类的构造函数,对基类数据成员初始化。
2)调用内嵌对象成员的构造函数,对内嵌对象成员的数据成员初始化。
3)执行派生类的构造函数体,对派生类数据成员初始化。
撤销对象时,析构函数的调用顺序与构造函数的调用顺序正好相反。首先执行派生类的析构函数,然后执行内嵌对象成员的析构函数,最后执行基类的析构函数。
说明:
1)在派生类中含有多个内嵌对象成员时,调用内嵌对象成员的构造函数的顺序由它们在类中声明的顺序确定的。
2)如果派生类的基类也是一个派生类,每个派生类只需要负责其直接基类数据成员的初始化。依次上溯。