首页 理论教育 C++虚析构函数简介

C++虚析构函数简介

时间:2023-08-20 理论教育 版权反馈
【摘要】:在继承体系中有虚函数的情况下,我们需要使用虚析构函数,而不是一般的析构函数。虚析构函数也是一种虚函数,它的存放位置与虚函数一样,因此派生类的虚析构函数可以覆盖基类的虚析构函数,从而使基类指针得以调用。动手写9.2.8动手写9.2.8展示了虚析构函数的效果。运行结果如图9.2.7所示:图9.2.7虚析构函数我们可以看到,这次两个派生类的析构函数都被调用了。同样地,派生类的虚析构函数也可以省略virtual关键字。

C++虚析构函数简介

我们知道,析构函数会在对象的生命周期的最后被自动调用。那么当基类指针指向带有虚函数的派生类的时候,派生类的析构函数是否也会被自动调用呢?让我们来看一个示例:

动手写9.2.7

动手写9.2.7展示了基类指针指向派生类后析构函数的调用情况,运行结果如图9.2.6所示:

图9.2.6 派生类的非虚析构函数

我们可以看到,在第一次delete基类指针的时候,Airplane的析构函数并没有被调用,第二次delete的时候,Car的析构函数也没有被调用。

在继承体系中有虚函数的情况下,我们需要使用虚析构函数,而不是一般的析构函数。虚析构函数也是一种虚函数,它的存放位置与虚函数一样,因此派生类的虚析构函数可以覆盖基类的虚析构函数,从而使基类指针得以调用。而一般的析构函数会像成员函数那样在类型转换的时候被截取,基类指针并不能得知它的存在。(www.xing528.com)

动手写9.2.8

动手写9.2.8展示了虚析构函数的效果。运行结果如图9.2.7所示:

图9.2.7 虚析构函数

我们可以看到,这次两个派生类的析构函数都被调用了。虚析构函数与普通析构函数的区别就是有一个virtual关键字。同样地,派生类的虚析构函数也可以省略virtual关键字。

那么在什么情况下我们需要写虚析构函数呢?答案是只要有虚函数就需要。因为只要有虚函数,就有使用基类指针调用虚函数的实例,那么基类指针在指向派生类的时候就有可能只会调用基类的指针,这在动手写9.2.8中展示得很清晰。然而如果我们是在本地栈上创建派生类对象,就算后面赋值给了基类指针,到了作用域的最后,派生类对象也会自动调用自己的析构函数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈