C++虚析构函数

Posted Linux编程学堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++虚析构函数相关的知识,希望对你有一定的参考价值。

2.2 虚析构函数

在定义一个C++类的时候,应该定义构造函数和析构函数。其中,析构函数的作用是在对象撤销之前做必要的“清理现场”的工作。当派生类的对象从内存中撤销的时候,一般先调用派生类的析构函数,然后,再调用基类的析构函数。

但是,如果用new运算符建立了临时对象,若基类中有析构函数,并且定义了一个指向该基类的指针变量。在程序中用带指针参数的delete运算符撤销对象时,会发生一个情况:系统会只执行基类的析构函数,而不执行派生类的析构函数。如下是一个程序测试例子:

程序运行结果如下:

可以看到,定义一个基类animal指针变量,指向派生类dog对象。然后,通过该delete来销毁pa指针指向的对象。此时,调用的析构函数是基类animal定义的析构函数,而不是派生类dog的析构函数。

那么,这样的操作就会导致错误。因为,我们创建的是dog对象,最终销毁的并不是dog对象。针对这样的情况,我们可以把析构函数定义为“虚函数”,就可以解决问题。修改如下:

virtual ~animal()

cout << "基类动物析构函数" << endl;

程序运行结果如下:

可以看到,执行delete pa; 销毁指针对象的时候,先执行派生类dog的析构函数,再执行基类animal的析构函数。

那么,看到这个特性,我们良好的编程习惯应该是:所有的类析构函数,都声明为虚函数。所有,修改后的完整测试代码如下:

程序运行结果如下:

可以看到,用new关键字定义了派生类dog的对象。然后,销毁对象时,先执行派生类dog的析构函数,再执行基类animal的析构函数。

先调用了派生类的析构函数,再调用基类的析构函数,这符合人们的期望。当基类的析构函数为虚函数的时候,无论指针指向的同一族类中的哪一个类对象,当对象撤销的时候,系统会采用动态关联,调用相应派生类的析构函数,对该对象进行清理工作。

如果将基类的析构函数声明为虚函数,由该基类所派生的所有派生类的析构函数也都自动成为虚函数。

虚析构函数的概念和用法很简单,但是,它在面向对象程序设计中却是很重要的技巧。专业人员一般都习惯声明虚析构函数,即使基类并不需要析构函数,也显式地定义一个函数体为空的虚析构函数,以保证在撤销动态存储空间时能够得到正确的处理。

以上是关于C++虚析构函数的主要内容,如果未能解决你的问题,请参考以下文章

通过C++编译视频平台为什么要使用virtual虚析构函数?

C++虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数

C++中虚析构函数的作用及原理

面试中常被问到C++析构函数,虚析构函数

C++中的各种“虚“-- 虚函数纯虚函数虚继承虚基类虚析构纯虚析构抽象类讲解