同样派生类不能继承基类析构函数,所以需要的话就要定义派生类自己的析构,派生类只需清理新增成员就可以,至于基类和内嵌对象,系统自动调用基类和内嵌对象成员的析构函数。
调用顺序,我们只要记得和构造顺序相反就可以:
1、清理派生类新增成员 2、调用内嵌对象成员所属类的析构 3、调用基类析构
上述如果涉及多个基类或内嵌对象,同样遵循与构造函数执行时相反的顺序。
#include<iostream>
using namespace std;
class Base1
{
public:
Base1(){cout<<"Base1 construct"<<endl;} //默认构造
~Base1(){cout<<"Base1 析构"<<endl;}
};
class Base2
{
public:
Base2(int x){cout<<"Base2 construct"<<x<<endl;}
//带参数,派生类构造必须给出基类名和参数表
~Base2(){cout<<"Base2 析构"<<endl;}
};
class Base3
{
public:
Base3(int x){cout<<"Base3 construct"<<x<<endl;}
~Base3(){cout<<"Base3 析构"<<endl;}
};
class Derived : public Base2,public Base3,public Base1 //公有继承,注意声明顺序
{
public:
Derived(int i,int j,int k,int l):b2(i),Base3(k),Base2(j),b3(l){};
//遵循先基类后内嵌,同类型的调用依照声明顺序,具体参数值查看参数表
//基类Base2->Base3->Base1 内嵌对象Base1->Base2->Base3
private:
Base1 b1; //内嵌成员,注意声明顺序
Base2 b2;
Base3 b3;
};
int main()
{
Derived d(1,2,3,4);
return 0;
}
/* 中心对称
输出结果:
Base2 construct2
Base3 construct3
Base1 construct
Base1 construct
Base2 construct1
Base3 construct4
Base3 析构
Base2 析构
Base1 析构
Base1 析构
Base3 析构
Base2 析构
*/