基类的析构函数一般都会被声明成虚函数,原因是,若是不设置成虚函数,在实现多态时,将子类对象赋给基类指针,在析构的过程中,只会调用基类的析构函数进行清除工作,而不会调用派生类的析构函数。
代码示例说明:
class Base
{
public:
Base(){};
~Base(){cout<<"Base destructor"<<endl;}
virtual void Show(){cout<<"Base Show"<<endl;}
};
class Derived:public Base
{
public:
Derived(){};
~Derived(){cout<<"Derived destructor"<<endl;}
virtual void Show(){cout<<"Derived Show"<<endl;}
};
Base* pBase = new Derived();
pBase->Show();
delete pBase;
输出:
Derived Show
Base destructor
说明析构的时候,派生类的析构函数没有被调用,这样就只是析构了对象基类的部分,派生的部分没有被析构,就会造成内存泄漏。
若是将Base类的析构函数改成虚函数,就会输出:
Derived Show
Derived destructor
Base destructor
说明此时,new的对象被完整的析构