首页 > 其他分享 >有了析构函数之后,为什么还要虚析构和纯析析构?

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

时间:2023-08-27 23:36:42浏览次数:26  
标签:Name 子类 纯析析构 析构 父类 虚析构 纯虚析构

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

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

  虚析构的语法: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 }

 

标签:Name,子类,纯析析构,析构,父类,虚析构,纯虚析构
From: https://www.cnblogs.com/py369/p/17661093.html

相关文章

  • 类定义、属性、初始化和析构知识点总结
    一:前言:为什么要学类?   类是一个独立存放变量(属性/方法)的空   1.简化代码,提升效率,避免代码重复写入。如用户注册、校验、登录方法可以放在一个类中,需要哪个方法就调用哪个类===》建立模型框架(建立一个方法)===》很多鼠标(实例化)===》都是独立的2.面向对象:直接给我......
  • C++构造函数、析构函数、初始化列表
    构造函数构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化任务:一般负责对类对象进行初始化、资源分配class类名{int*p;public:类名(参数){p=newint;}}......
  • Python基础入门学习笔记 041 魔法方法:构造和析构
     __init__(self[,...]) 方法是类在实例化成对象的时候首先会调用的一个方法1>>>classRectangle:2def__init__(self,x,y):3self.x=x4self.y=y5defgetPeri(self):6return(self.x+self.y)*27defgetArea......
  • C++ 构造函数与析构函数
    构造函数和析构函数构造函数构造函数会在实例化对象的时候执行,可以在实例化时传入参数。构造函数没有返回值。不需要声明返回值。构造函数的函数名与类名保持一致。//classname:PlayerPlayer(intxa=0,intya=0){//构造函数,传入初始坐标进行初始化......
  • JavaScript中的析构对象,析构数组与展开运算符
    前言这些是JavaScript中重要的编程思想,这些析构对象,析构函数与展开运算符很重要这块内容不怎么难,纯属一些语法,但是在所谓的函数式编程,以及React中却是广泛使用的逆向思维,之前是怎么构造,而现在让你如何展开,获取里面的内容!!逆向思维,之前是怎么构造,而现在让你如何展开,获取里面的内......
  • 2.为什么析构函数一般写成虚函数
    2.为什么析构函数一般写成虚函数在C++实现多态里,有一个关于析构函数的重写问题:基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相同,看起来违背了重写的规则,但实际上编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......
  • 【转载】父类(基类)的虚析构函数
    【推荐】基类建议使用虚析构函数,其子类、孙类不使用虚析构。当一个类不作为基类使用时,不建议使用虚析构函数,虚析构函数会增加一个虚函数表指针的长度,从而增加类对象的占用空间【具体现象】1、基类析构函数不定义为虚析构,当我们用基类指针指向子类对象的时候,只会调用基类析......
  • 析构函数虚表指针回填问题
    1问题提出笔者偶然发现对于含有虚函数的类,析构函数也会更新虚表指针。小有所得,特此记录。这里使用vs202232位debug作为实验环境。对于一个有虚函数的类,编译器在生成构造函数时,不只生成我们自己写的虚构函数里面的语句,还会把虚表地址赋值到对象中。比如如下类,构造函数里面根......
  • c++内存分布之虚析构函数
    关于本文代码演示环境:VS2017+32程序虚析构函数是一种特殊的虚函数,可以知道,虚函数影响的内存分布规律应该也适用虚析构函数。看看实际结果。Note,一个类中,虚析构函数只能有一个。本文将展开单一继承和多继承两种情况结论1.虚函数表指针和虚函数表1.1影响虚函数表指......