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

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

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

  虚析构的语法: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 @   潘阳399  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示