析构函数
与构造函数类似,派生类也不可以继承基类的析构函数,若想完成派生类中新增数据成员的资源释放,需要在派生类中定义析构函数。同样,若派生类中没有显式定义析构函数,编译系统会提供一个默认的析构函数。
析构函数执行次序与构造函数相反,先要调用派生类的析构函数,然后再调用基类的析构函数。接下来通过一个案例查看派生类中析构函数的调用过程,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3
4 class Animal //定义基类
5 {
6 public:
7 Animal(int con_weight, int con_age); //声明带参构造函数
8 ~Animal()
9 {
10 cout << "Animal destructor!" << endl;
11 system("pause");
12 }
13 int get_age(){ return m_nAge; } //获取m_nAge属性值
14 private:
15 int m_nWeight, m_nAge;
16 };
17 Animal::Animal(int con_weight, int con_age) //定义基类带参构造函数
18 {
19 m_nWeight = con_weight;
20 m_nAge = con_age;
21 cout << "Animal constructor with param!" << endl;
22 }
23
24 class Cat:public Animal{ //定义派生类
25 public:
26 //声明带参构造函数
27 Cat(string con_name, int con_weight, int con_age);
28 ~Cat(){ cout << "Cat destructor!" << endl; } //定义析构函数
29 private:
30 string m_strName;
31 };
32 //定义派生类带参的构造函数
33 Cat::Cat(string con_name, int con_weight, int con_age):Animal(con_weight, con_age)
34 {
35 m_strName = con_name;
36 cout << "Cat constructor with param!" << endl;
37 }
38
39 int main()
40 {
41 Cat cat("Persian", 3, 4); //定义派生类对象
42 cout << "cat age = " << cat.get_age() << endl;//调用get_age()函数
43 return 0;
44 }
程序运行结果如图1所示。
图1 例1运行结果
例1中显式定义了基类和派生类的析构函数。从运行结果看创建派生类对象时会依次调用基类和派生类的构造函数,对象生命期结束时会先调用派生类的析构函数,再调用基类的析构函数。