C++中为什么有时基类的析构函数必须写为虚函数
说到虚函数之前,先简单解释一下多态,我的这篇博文:http://blog.csdn.net/zcyzsy/article/details/52463355 里有很详细的解释多态,这里简单说下:
当不同对象调用相同名称的成员函数时,可能引起不同的行为(即执行不同的代码)。这种现象称为多态性。将函数调用连接相应函数体的代码的过程称为函数联编(简称联编)。C++中根据联编时刻不同,分为静态联编和动态联编。
静态联遍:不同的类可以有相同名称的成员函数,编译器在编译时对他们进行函数联编,这种在编译时刻进行的联编称为静态联编。静态联编所支持的多态性就是编译时多态性(也称编译期多态性、静态多态性)。函数重载和运算符重载就属于编译时多态性。
动态联编:在动态联编中,在程序运行时才能确定调用哪个函数。这种在运行时的函数联编称为动态联编。动态联编所支持的多态性就是运行时多态性(也称运行期多态性、动态多态性)。C++中,只有虚函数才可能是动态联编的。可以通过定义类的虚函数和创建派生类,然后在派生类中重新实现虚函数,实现具有运行时的多态性。
综上,知道虚函数的作用了,那么为什么析构函数有时要声明为虚函数?
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以通常是将析构函数声明为虚函数。一个基类的函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见最好还是加上virtual修饰符。
简言之:在实现多态时,当用基类指针操作派生类对象时,在析构时防止只析构基类而不析构派生类的状况发生,因此将基类的析构函数声明为虚函数。
测试代码如下:
1.
#include<iostream>
using namespace std;
class BaseClass
{
publi