为什么基类的析构函数最好声明为虚函数?
一般在c++程序中我们都会将基类的析构函数声明为虚函数, 那为什么要是虚函数呢?我们来看一下下面的例子首先定义一个基类Base , 然后定义一个派生类 Derived ,Derived继承自Base。
using namespace std;
class Base
{
public:
Base()
{
cout << "Base()" << endl;
}
~Base()
{
cout << "~Base()" << endl;
}
};
class Derived:public Base
{
public:
Derived()
{
cout << "Derived()" << endl;
}
~Derived()
{
cout << "~Derived()" << endl;
}
};
int main()
{
Base* pB = new Derived;
delete pB;
return 0;
}
当Base的析构函数不是虚函数时,程序运行起来会发生下面结果:
想象一下这是非常危险的事情,我们一般情况下在析构函数中都需要销毁对象,释放内存空间,如果析构函数没有正常的执行便会
造成内存泄漏的问题。
为了解决这一问题我们将基类的析构函数声明为虚函数,这个时候我们再来看看结果:
Base::virtual ~Base()
{
cout << "~Base()" << endl;
}
那么为什么将基类的析构函数声明为虚函数就可以很好的避免内存泄漏这一问题呢?
那是因为我们定义了一个基类的指针用来指向了一个为派生类对象开辟的空间,这个时候如果delete指针pB时系统会默认delete指针所属类型
那么就只会调用基类的析构函数,而当我们将基类的析构函数声明为虚函数时,再次delete会动态的绑定派生类的对象,释放派生类对象的内存空间
这样就会依次调用基类和派生类的析构函数。