您的位置:首页 > 编程语言 > C语言/C++

C++基础:派生类的构造函数与析构函数调用顺序

2016-07-20 22:34 459 查看
派生类的构造函数与析构函数调用顺序:

派生类的构造函数的定义形式为:

派生类名::派生类名(参数总表):基类名1(参数表1),基类名2(参数表2),成员对象名1(成员对象参数表1),成员对象名2(成员对象参数表2)

{
……   //派生类新增成员的初始化;

} //所列出的成员对象名全部为新增成员对象的名字

在构造函数的声明中,冒号及冒号以后部分必须略去。

     

冒号后的基类名,成员对象名的次序可以随意,这里的次序与调用次序无关。

析构函数的调用与构造函数相反。

<span style="font-size:18px;">#include <iostream>
using namespace std;

class Base1
{
public:
Base1(int d1):data1(d1)
{
cout<<"Create Base1"<<endl;
}
~Base1()
{
cout<<"Free Base1"<<endl;
}

private:
int data1;
};

class Base2
{
public:
Base2(int d2):data2(d2)
{
cout<<"Create Base2"<<endl;
}
~Base2()
{
cout<<"Free Base2"<<endl;
}

private:
int data2;
};

class Base3
{
public:
Base3(int d3):data3(d3)
{
cout<<"Create Base3"<<endl;
}
~Base3()
{
cout<<"Free Base3"<<endl;
}

private:
int data3;
};

class D : public Base1,public Base2, public Base3
{
public:
D(int a,int b,int c,int x,int y,int z):Base1(a),Base2(b),Base3(c),b3(x),b2(y),b1(z)  //参数列表初始化
{
cout<<"Create D"<<endl;
}
~D()
{
cout<<"Free D"<<endl;
}

private:
Base3 b3;
Base2 b2;
Base1 b1;
};

int main()
{
D d(1,2,3,4,5,6);
return 0;
}
</span>

派生类构造函数各部分的执行次序为: 

1.调用基类构造函数,按它们在派生类定义的先后顺序,顺序调用。 

2.调用成员对象的构造函数,按它们在类定义中声明的先后顺序,顺序调用

3.派生类的构造函数体中的操作。

Create Base1    //1.

Create Base2

Create Base3

Create Base3    //2.

Create Base2

Create Base1

Create D        //3.

Free D

Free Base1

Free Base2

Free Base3

Free Base3

Free Base2

Free Base1

注意:

*在派生类构造函数中,只要基类不是使用缺省构造函数都要显式给出基类名和参数表。

*如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。

*如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: