文章目录
- 1.派生类的析构函数
1.派生类的析构函数
- 在派生时, 派生类是不能继承基类的析构函数的, 也需要通过派生类的析构函数去调用基类的析构函数。
- 派生类中可以根据需要定义自己的析构函数, 用来对派生类中所增加的成员进行清理工作。 基类的清理工作仍然由基类的析构函数负责。
- 在执行派生类的析构函数时, 系统会自动调用基类的析构函数和子对象的析构函数, 对基类和子对象进行清理。
- 析构函数调用的顺序与构造函数正好相反:
先执行派生类自己的析构函数, 对派生类新增加的成员进行清理, 然后调用子对象的析构函数, 对子对象进行清理, 最后调用基类的析构函数, 对基类进行清理。 - eg1:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A constructor"<<endl;
}
~A()
{
cout<<"A destructor"<<endl;
}
};
class B:public A//B类是被A类派生的
{
public:
B()
{
cout<<"B constructor"<<endl;
}
~B()
{
cout<<"B destructor"<<endl;
}
};
class C:public B
{
public:
C()
{
cout<<"C constructor"<<endl;
}
~C()
{
cout<<"C destructor"<<endl;
}
};
int main()
{
C test;
return 0;
}
运行结果:
A constructor
B constructor
C constructor
C destructor
B destructor
A destructor
结论:构造和析构的顺序是相反的
- eg2:
#include <iostream>
#include <string>
using namespace std;
class Undergraduate//基类
{
protected://保护部分
int num;
string name;
char sex;
public://公用部分
Undergraduate(int n, string nam, char s)//基类构造函数,这里没用初始化列表
{
num=n;
name=nam;
sex=s;
}
~Undergraduate() {}//基类析构函数
};
class graduate_stu:public Undergraduate//公用派生类
{
private://派生类的私有部分
int age;
string addr;
public:
//派生类构造函数
//graduate_stu类的构造函数的参数:继承的数据成员+本身的数据成员
graduate_stu(int n, string nam, char s, int a, string ad):Undergraduate(n, nam, s)//首先显示调用Undergraduate的构造函数,因为其构造函数带参数
{
age=a;
addr=ad;
}//在函数体中只对派生类新增的数据成员初始化
void show()
{
cout<<"num: "<<num<<"name: "<<name<<"sex: "<<sex<<"age :"<<age<<"address: "<<addr<<endl;
}
~graduate_stu(){ }//派生类析构函数
};
int main()
{
//创建派生类对象
graduate_stu stud1(10010,"wang-li",'f',"19","115 Beijing road,Shanghai");
graduate_stu stud2(10011,"Zhang-fun",'m',21,"213 Shanghai Road, Beijing");
stud1.show();//输出第一个学生的数据
stud2.show(); //输出第二个学生的数据
return 0;
}
先对stud2进行析构,再对stud1进行析构
运行结果:
num: 10010name: Wang-lisex: fage: 19address: 115 Beijing Road,Shanghai
num: 10011name: Zhang-funsex: mage: 21address: 213 Shanghai Road,Beijing