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

派生类的构造函数与析构函数调用顺序:


派生类的构造函数的定义形式为:
派生类名::派生类名(参数总表):基类名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

注意:


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

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


*如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数。








  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值