首页 > 编程知识 正文

派生类调用基类成员函数,关于派生类构造函数的描述中

时间:2023-05-04 12:33:24 阅读:163271 作者:4733

派生类的构造函数基类的构造函数和析构函数派生类不能继承。 如果派生类需要初始化新成员或执行某些清理任务,则必须自己定义构造函数和析构函数。 也可以使用基类的构造函数初始化从基类继承的成员。

要使用派生类中的对象,以前必须对数据成员进行初始化赋值。 派生类中的数据成员包含从基类继承的数据成员和派生类添加的数据成员,并且可能包含其他类的对象作为其数据成员。 如果包含其他类的对象,则实际上也会间接包含这些对象的数据成员。

要初始化派生类,必须初始化基类的数据成员、派生类的新数据成员和其他嵌入类对象的数据成员。

派生类必须添加自己的构造函数,因为它不能继承基类的构造函数。 派生类的构造函数需要使用传递给派生类的参数调用基类构造函数和嵌入对象成员的构造函数来初始化它们的数据成员,然后添加新语句以初始化派生类的新成员

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

派生类名称:派生类名称(参数表) :基类名称1 )参数表1 )、基类名称m )参数名称m )、嵌入对象名称(嵌入对象参数表1 ) }派生类的构造函数名称也必须与类名相同。 构造函数参数表提供了初始化基类数据成员、新数据成员和嵌入式对象数据成员的所有参数。

指定所有这些参数后,请指定要初始化的基类名称及其参数表以及嵌入对象名称及其参数表,如上所述。 可以按任意顺序对每个基类名称和内联对象名称进行排序。

虽然这种语法格式可能被认为太复杂了,但其实构造函数也不是必须这么复杂。

如果类从多个基类继承,即多个继承,则必须为具有构造函数参数的基类显式指定基类名称及其参数表,而为使用缺省构造函数的基类指定基类名称及其参数表同样,如果嵌入对象的构造函数也有参数,则必须指定嵌入对象名称及其参数表;如果使用默认构造函数,则不需要指定嵌入对象名称及其参数表。

想想看。 如果派生类只有一个基类,并且具有默认构造函数,没有嵌入对象,或者可以使用其他公共函数成员初始化嵌入对象,则不需要后面的基类和嵌入对象名称。 形式简单吗? 其实我们最常用的并不比这种最简单的情况复杂。

如果基类的构造函数具有参数,则派生类必须定义构造函数,然后将传递的参数传递给基类的构造函数以初始化基类。

如果基类没有定义构造函数,则派生类不需要定义构造函数,而是都可以使用缺省构造函数,并用其他公共函数成员初始化派生类的新数据成员。

如果基类同时定义了缺省构造函数和带参数的构造函数,则派生类的构造函数可以提供基类名称及其参数表,也可以不显式提供。

构建派生类的对象并调用构造函数时的处理顺序如下:

1 .首先调用基类的构造函数,如果有多个基类,调用顺序按照派生类声明时从左到右出现的顺序;

2 .如果有嵌入对象成员,则调用嵌入对象成员的构造函数;如果是多个嵌入对象,则按照派生类中声明的顺序调用。 如果没有嵌入对象,则跳过此步骤;

3 .调用派生类构造函数的语句。

基类和嵌入对象成员的构造函数的调用顺序与它们在派生类的构造函数中出现的顺序无关。

下面以派生类的构造函数为例进行说明。

派生类Child中有三个基类Base1、Base2和Base3,继承方式都是公共继承,Base1中只有一个缺省构造函数,Base2类和Base3类中有参数

# includeiostreamusingnamespacestd; class Base1 //基类Base1,默认构造函数{ public : base1() } { cout ' base1construct ' endl; }; class Base2 //基类Base2,带参数的构造函数{public:base2(intx ) { cout'Base2 construct 'xendl; }; class Base3 //基类Base3,带参数的构造函数{public:base3(inty ) { cout'Base3 construct 'yendl; }; class Child : public Base2,public Base1,public Base3 //派生类child{public3360child(intI,int j,int k,int m ) 3360base2 Base2 b2; Base3 b3; (; intmain((childchild ) ) 3、4、5、6 ); 返回0; }

上面的Base2和Base3类具有带参数的构造函数,因此派生类Chi

ld必须定义带参数的构造函数。

Child类构造函数的参数表给出了基类Base2和Base3、内嵌对象成员b2和b3需要的所有参数。

因为基类Base1只有默认构造函数,没有参数,所以类Base1和Base1类的对象成员b1都不需要列在派生类的构造函数中。

Child类的构造函数中基类Base2和Base3以及对象成员b2和b3可以按照任意的顺序排列。

主函数main中声明了派生类Child的对象child,构造对象child时会调用Child类的构造函数,执行时先调用基类的构造函数,调用顺序按照它们在派生类声明时从左到右出现的顺序,即按照先Base2再Base1后Base3的顺序,调用基类构造函数后就调用内嵌对象成员的构造函数,按照它们在派生类中声明的顺序调用,即按照先b1再b2后b3的顺序。

基类Base1和Base1类的对象成员b1没有显式列出,执行调用Base1类的默认构造函数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。