构造函数和析构函数的调用顺序

上一篇说到了virtual关键字的使用范围以及虚函数。

先上一段代码:

 1 #include "pch.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class Father {
 6 public:
 7     Father() {
 8         cout << "我是父类的构造函数" << endl;
 9     }
10     ~Father() {
11         cout << "~我是父类的析构函数" << endl;
12     }
13 };
14 class Child1 : public Father {
15 public:
16     Child1() {
17         cout << "我是子类1的构造函数" << endl;
18     }
19     ~Child1() { 
20         cout << "我是子类1的析构函数" << endl;
21     }
22 };
23 
24 
25 int main()
26 {
27     Father *fa = new Child1();
28     delete fa;
29 }

输出是:

我是父类的构造函数
我是子类1的构造函数
~我是父类的析构函数

可见子类的析构函数并未被调用,因为delete掉的是指向父类的指针,子类的对象还是仍然存在,这是很危险的,子类的那一片内存空间并未被释放。

想要同时调用子类的析构函数,我们需要将父类的析构函数设置成为虚析构函数,将父类指针动态绑定到子类对象上,这时执行析构函数时,就会先析构子类,再析构父类了。

 1 #include "pch.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 class Father {
 6 public:
 7     Father() {
 8         cout << "我是父类的构造函数" << endl;
 9     }
10     virtual ~Father() {
11         cout << "~我是父类的析构函数" << endl;
12     }
13 };
14 class Child1 : public Father {
15 public:
16     Child1() {
17         cout << "我是子类1的构造函数" << endl;
18     }
19     ~Child1() {
20         cout << "我是子类1的析构函数" << endl;
21     }
22     class ChildChild {
23         ChildChild() {
24             cout << "我是子类的子类的构造函数" << endl;
25         }
26         ~ChildChild() {
27             cout<<"我是子类的子类的析构函数"<<endl;
28         }
29     };
30 };
31 
32 
33 int main()
34 {
35     Father *fa = new Child1();
36     delete fa;
37     //Child1 ch;
38     
39 }

 

输出如下:

我是父类的构造函数
我是子类1的构造函数
我是子类1的析构函数
~我是父类的析构函数

 

posted @ 2019-03-07 19:41  leoncumt  阅读(310)  评论(0编辑  收藏  举报