首页 理论教育C++程序设计教程:派生类构造函数

C++程序设计教程:派生类构造函数

【摘要】:所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。最后执行派生类的构造函数。其中,如果派生类新增成员中有某个类的子对象,第步的调用才会执行,否则就直接跳转到第步,执行派生类的构造函数。在某些情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。

从基类派生子类时,基类的构造函数不能够继承到派生类中,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。

派生类构造函数的一般语法格式如下:

这里,派生类的构造函数名与类名相同。在构造函数的参数表中,给出了初始化基类数据、新增对象数据及新增一般成员数据所需要的全部参数。在参数表之后,列出需要使用参数进行初始化的基类名和子对象名及各自的参数表,各项之间使用逗号分隔。这里基类名、子对象名之间的次序无关紧要,它们各自出现的顺序可以是任意的。在生成派生类对象时,系统首先会使用这里列出的参数,来调用基类和子对象的构造函数。

派生类构造函数执行的一般次序如下:

(1)最先调用基类的构造函数,多个基类则按派生类声明时列出的次序、从左到右调用,而不是初始化列表中的次序。

(2)再次调用对象成员(子对象)的构造函数,按类声明中对象成员出现的次序调用,而不是初始化列表中的次序。

(3)最后执行派生类的构造函数。

其中,如果派生类新增成员中有某个类的子对象,第(2)步的调用才会执行,否则就直接跳转到第(3)步,执行派生类的构造函数。

【例6.5】分析以下程序的执行结果。

解:上述程序中,类B是类A的派生类(属单继承的情况),它的构造函数B的冒号后面是成员初始化列表,如果该表中有多项,它们之间用逗号分隔。该成员初始化列表的顺序是:先是基类A构造函数;再是派生类B中子对象类的构造函数;最后是派生类B的构造函数。程序的执行结果如下:

A Constructor2

B Constructor2

x1=22

x2=12

在实际应用中,使用派生类构造函数时应注意如下两个问题:

(1)派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是在基类中必须有默认的构造函数或者根本没有构造函数。

(2)当基类的构造函数使用一个或多个参数时,则派生类必须定义构造函数,提供将参数传递给基类构造函数的途径。在某些情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。(www.chuimin.cn)

【例6.6】分析以下程序的执行结果。

解:上述程序中,由A和B两个类派生出类C(属多继承的情况),在指定派生的语句中,B在前,A在后,所以先调用B的构造函数,后调用A的构造函数。程序的执行结果如下:

B Constructor

A Constructor

C Constructor

a=3

b=7

c=5

若基类和派生类都包含其他类的对象,在创建派生类的对象时,首先执行基类成员对象的构造函数,然后执行基类的构造函数,再执行派生类成员对象的构造函数,执行派生类的构造函数。析构函数是按照对应的构造函数调用的相反顺序来调用的。

【例6.7】分析以下程序的执行结果。

解:程序执行结果如下:

classs A

classs C

classs B

classs D

上述程序中,由类C派生出类D,但类C中包含一个类A的对象a,类D中包含一个类B的对象b。所以,对于main()函数中的语句D d,先执行基类C中对象a的构造函数,再执行基类C的构造函数,接着是类D中对象b的构造函数,最后执行类D的构造函数。