有了析构函数之后,为什么还要虚析构和纯析析构?

  我们知道析构函数释放父类的资源的,但如果子类中有属性开辟到堆区,那么父类是无法调用到子类的析构代码的,子类的占用的堆区内存如果没有得到释放,那么会造成内存泄漏。

  那么要让父类的指针能够调用子类的析构函数,释放子类的堆区内存,就要用到虚析构或者纯虚析构。

  虚析构的语法:virtual ~类名()

         {

         }

  纯虚析构的语法: virtual ~类名()=0;

           类名::~类名()

           {

           }

  

  虚析构函数和纯虚析构函数相同点:

    1,可以解决父类指针释放子类对象。

    2.都需要具体实现。

  不同之处:

    如果是纯虚析构,该类属于抽象类,无法实例化对象

 1 #include<iostream>
 2 
 3 using  namespace std;
 4 
 5 class Animal
 6 {
 7 public:
 8     Animal()
 9     {
10         cout << "Animal的构造函数" << endl;
11     }
12     virtual void speak() = 0;
13 
14     //虚析构
15     //virtual ~Animal()  //不加virtual 就不会调用子类的析构函数,会造成内存泄漏
16     //{
17     //    cout << "Animal的虚析构" << endl;
18     //}
19 
20     //纯虚析构 ,该类属于抽象类,没有定义就无法实例化对象
21     virtual ~Animal() = 0;
22 };
23 
24 Animal::~Animal()
25 {
26     cout << "Animal的纯虚析构" << endl;
27 
28 }
29 class  cat :public Animal
30 {
31 public:
32     cat(string name)
33     {
34         m_Name = new string(name);
35     }
36     
37     void speak()
38     {
39         cout << "小猫在说话" << endl;
40     }
41 
42     ~cat()
43     {
44         cout << "cat的析构函数调用" << endl;
45         if (this->m_Name != NULL)
46         {
47             delete m_Name;
48             m_Name = NULL;
49         }
50     }
51 
52 public:
53     string *m_Name;
54 };
55 int main()
56 {
57     Animal* animal = new cat("Tom");
58     animal->speak();
59     delete animal;
60 
61     return 0;
62 }

 

posted @ 2023-08-27 23:15  潘阳399  阅读(41)  评论(0编辑  收藏  举报