C++中建立派生类对象时构造函数的调用顺序
建立派生类对象时,派生类构造函数的调用顺序如下:
- 执行基类的构造函数。当派生类有多个基类时,处于同一层次的各个基类的构造函数的调用顺序取决于定义派生类时生命的顺序(从左至右),而与在派生类构造函数的成员初始化列表中给出的顺序无关。如果派生类的基类也是一个派生类,则每个派生类值需负责它的直接基类的构造,依次上溯。
- 执行成员对象的构造函数(如果有的话)。当派生类中有多个成员对象时,各个成员对象构造函数的调用顺序也取决于在派生类中定义的顺序(自上而下),而与在派生类构造函数的成员初始化列表中给出的顺序无关。
- 执行派生类的构造函数。
派生类构造函数的定义中可以省略对基类构造函数的调用,其条件是基类中必须有默认的构造函数或者根本就没有定义构造函数。
派生类析构函数的调用顺序:
- 执行派生类的析构函数,对派生类新增普通成员进行清理。
- 调用成员对象析构函数,对派生类新增的成员对象进行清理。
- 调用基类的析构函数,对基类进行清理。
派生类析构函数的定义与基类无关,与没有继承关系的类中的析构函数的定义完全相同。它只负责新增成员的清理工作,系统会自己调用基类及成员对象的析构函数进行相应的清理工作。
#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!
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!