【C++】 --- 虚析构函数

简介: 【C++】 --- 虚析构函数

1、为什么需要虚析构函数

如果基类析构函数不是虚析构函数,派生类的析构函数不会被调用

2、虚析构函数的作用

通过父类指针,把所有的子类对象的析构函数执行一遍

通过父类指针释放所有的子类资源

3、代码场景分析

1. #define _CRT_SECURE_NO_WARNINGS
2. #include <iostream>
3. using namespace std;
4. 
5. class A
6. {
7. public:
8.  A()
9.  {
10.     p = new char[20];
11.     strcpy(p, "obja");
12.     cout << "A" << endl;
13.   }
14.    virtual ~A()
15.   {
16.     delete[] p;
17.     cout << "~A" << endl;
18.   }
19. 
20. private:
21.   char *p;
22. };
23. 
24. class B :public A
25. {
26. public:
27.   B()
28.   {
29.     p = new char[20];
30.     strcpy(p, "objb");
31.     cout << "B" << endl;
32.   }
33.   ~B()
34.   {
35.     delete[] p;
36.     cout << "~B" << endl;
37.   }
38. protected:
39. 
40. private:
41.   char *p;
42. };
43. 
44. class C :public B
45. {
46. public:
47.   C()
48.   {
49.     p = new char[20];
50.     strcpy(p, "objc");
51.     cout << "C" << endl;
52.   }
53.   ~C()
54.   {
55.     delete[] p;
56.     cout << "~C" << endl;
57.   }
58. protected:
59. 
60. private:
61.   char *p;
62. };
63. 
64. void howtoDelete(A *base)
65. {
66.   delete base;    //不会变现出多态的属性
67. }
68. 
69. int main()
70. {
71.   A *p = new C();
72.   delete p;
73. 
74.   C *p1 = new C();
75.   howtoDelete(p1);
76. 
77. 
78.   system("pause");
79. }
80.

去掉virtual关键字,执行结果如下:

加上virtual关键字重新执行,结果如下:

相关文章
|
C++
53 C++ - 虚析构函数
53 C++ - 虚析构函数
34 0
|
存储 Cloud Native 编译器
C++ 虚析构函数的作用?
C++ 虚析构函数的作用?
|
7月前
|
C++
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
C++|多态性与虚函数(2)|虚析构函数|重载函数|纯虚函数|抽象类
|
存储 编译器 C++
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
<c++>虚函数与多态 | 虚函数与纯虚函数 | 多态的实现原理 | 虚析构函数
146 0
|
缓存 Java 编译器
C++中为多态基类声明虚析构函数
C++中为多态基类声明虚析构函数
217 0
|
C++ 容器 C语言
读书笔记 effective c++ Item 7 在多态基类中将析构函数声明为虚析构函数
1. 继承体系中关于对象释放遇到的问题描述 1.1 手动释放 关于时间记录有很多种方法,因此为不同的计时方法创建一个TimeKeeper基类和一些派生类就再合理不过了: 1 class TimeKeeper { 2 3 public: 4 5 TimeKeeper(); 6 7 ~TimeKeeper(); 8 9 .
1144 0
|
C++
C++语言基础 例程 虚析构函数
贺老师的教学链接  本课讲解 问题的由来 #include &lt;iostream&gt; using namespace std; class Point { public: Point( ) { } ~Point() { cout&lt;&lt;"executing Point destructor"&lt;&lt;endl; } };
970 0
|
C++
C++虚析构函数解析
  当派生类对象从内存中撤销时一般先运行派生类的析构函数,然后再调用基类的析构函数。 如果用new运算符建立的派生类的临时对象,对指向基类的指针指向这个临时对象当用delete运算符撤销对象时,系统执行的是基类的析构函数,而不是派生类的析构函数,不能彻底的“清理现场”。
810 0
C++构造函数、析构函数、虚析构函数
1.构造函数   C++中的构造函数是用于初始化类的各种变量以及分配资源等。主要的注意事项是:   (1)在继承关系中先初始化父类对象后初始化子类对象。   (2)在一个类中按照变量的声明顺序,对类中的变量进行初始化。
1272 0
|
C++
C++学习笔记 -- 虚析构函数与纯虚析构函数
开始学C++了,所以又重拾以前学习过的相关概念… 析构函数是当一个对象的生命周期结束时,会自动执行析构函数。 析构函数的定义: #ifndef __A_H__#define __A_H__class A{public: A(void); A(int a, int b); ...
1467 0