C++中建立派生类对象时构造函数的调用顺序

C++中建立派生类对象时构造函数的调用顺序
建立派生类对象时,派生类构造函数的调用顺序如下:
  1. 执行基类的构造函数。当派生类有多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时生命的顺序(从左至右),而与在派生类构造函数的成员初始化列表中给出的顺序无关。如果派生类的基类也是一个派生类,则每个派生类值需负责它的直接基类的构造,依次上溯。
  2. 执行成员对象的构造函数(如果有的话)。当派生类中有多个成员对象时,各个成员对象构造函数的调用顺序也取决于在派生类中定义的顺序(自上而下),而与在派生类构造函数的成员初始化列表中给出的顺序无关。
  3. 执行派生类的构造函数。
派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是基类中必须有默认的构造函数或者根本就没有定义构造函数。

派生类析构函数的调用顺序:
  1. 执行派生类的析构函数,对派生类新增普通成员进行清理。
  2. 调用成员对象析构函数,对派生类新增的成员对象进行清理。
  3. 调用基类的析构函数,对基类进行清理。
派生类析构函数的定义与基类无关,与没有继承关系的类中的析构函数的定义完全相同。它只负责新增成员的清理工作,系统会自己调用基类及成员对象的析构函数进行相应的清理工作。
 
#include <iostream>
#include <stdio.h>
#include<math.h>
#include <string.h>

using namespace std;

class BaseA
{
public :
    BaseA(int i)
    {
        a=i;
        cout<<"BaseA 's constructor called!"<<endl;
    }
    ~BaseA(){cout<<"BaseA 's destructor called!"<<endl;}
    int GetA(){return a;}
private:
    int a;
};
class BaseB
{
public :
    BaseB(int i)
    {
        b=i;
        cout<<"BaseB 's constructor called!"<<endl;
    }
    ~BaseB(){cout<<"BaseB 's destructor called!"<<endl;}
    int GetB(){return b;}
private:
    int b;
};
class Member
{
public :
    Member(int i)
    {
        m=i;
        cout<<"Member 's constructor called!"<<endl;
    }
    ~Member(){cout<<"Member 's destructor called!"<<endl;}
    int GetM(){return m;}
private:
    int m;
};
class Derived:public BaseB,public BaseA
{
public:
    Derived(int i,int j,int k,int l);
    ~Derived(){cout<<"Derived 's destructor called!"<<endl;}
    void Print()
    {
        cout<<GetA()<<","<<GetB()<<","<<mem.GetM()<<","<<d<<endl;
    }
private:
    Member mem;
    int d;
};
Derived::Derived(int i,int j,int k,int l):BaseB(j),BaseA(i),mem(k)
{
    d=l;
    cout<<"Derived 's constructor called!"<<endl;
}

int main()
{
    Derived obj(1,2,3,4);
    obj.Print();
	return 0;
}
运行结果是:
BaseB 's constructor called!
BaseA 's constructor called!
Member 's constructor called!
Derived 's constructor called!
1,2,3,4
Derived 's destructor called!
Member 's destructor called!
BaseA 's destructor called!
BaseB 's destructor called!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值