派生类的构造函数与析构函数调用顺序:
派生类的构造函数的定义形式为:
派生类名::派生类名(参数总表):基类名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
注意:
*在派生类构造函数中,只要基类不是使用缺省构造函数都要显式给出基类名和参数表。
*如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数。
*如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。