当基类指针指向派生类对象时,如果基类的析构函数不是虚函数,那么在删除该指针时只会调用基类的析构函数,而不会调用派生类的析构函数。这会导致派生类对象的资源无法正确释放,从而引发内存泄漏和未定义行为。
class Base
{
public:
~Base() { cout << "Base destructor" << endl; }
};
class Derived : public Base
{
public:
~Derived() { cout << "Derived destructor" << endl; }
};
int main()
{
Base* ptr = new Derived();
delete ptr; // 只会调用Base的析构函数,而不会调用Derived的析构函数
return 0;
}
为了避免这种情况,可以将基类的析构函数声明为虚函数:
class Base {
public:
virtual ~Base() { cout << "Base destructor" << endl; }
};
class Derived : public Base {
public:
~Derived() { cout << "Derived destructor" << endl; }
};
int main() {
Base* ptr = new Derived();
delete ptr; // 会先调用Derived的析构函数,再调用Base的析构函数
return 0;
}