虚析构

C++ 中的虚析构有啥作用?

为什么要虚析构

当要使用基类指针或引用调用子类时,最好将基类的析构函数声明为虚函数,否则可以存在内存泄露的问题。

子类 B 继承自基类 A:

A *p = new B; delete p;

此时,如果类 A 的析构函数不是虚函数,那么 delete p;将会仅仅调用 A 的析构函数,只释放了 B 对象中的 A 部分,而派生出的新的部分未释放掉。

如果类 A 的析构函数是虚函数,delete p; 将会先调用B的析构函数,再调用 A 的析构函数,释放 B 对象的所有空间。

补充:

B *p = new B; delete p;

也是先调用 B 的析构函数,再调用 A 的析构函数。