当用基类对象的指针指向一个new生成派生类对象时,如果通过delete删除基类得指针:
1-如果基类析构函数不为虚析构函数,则只会调用基类得析构函数,而派生类的析构函数不会被调用,因此派生类的内存空间不会被清除。
2-如果基类析构函数为虚析构函数,则删除基类只指针的时候会调用基类和派生类中的所有析构函数,所有空间都将被释放。
#include
using namespace std;
class Base1 {
public:
~Base1() { cout << "~Base1()\n"; }
};
class Derived1 : public Base1 {
public:
~Derived1() { cout << "~Derived1()\n"; }
};
class Base2 {
public:
virtual ~Base2() { cout << "~Base2()\n"; }
};
class Derived2 : public Base2 {
public:
~Derived2() { cout << "~Derived2()\n"; }
};
int main() {
Base1* bp = new Derived1; // Upcast
delete bp;
Base2* b2p = new Derived2; // Upcast
delete b2p;
} ///:~
运行结果:
~Base1()
~Derived2()
~Base2()
可以看出,基类base1的析构函数不为虚函数,删除bp时只调用了base1的析构函数。但Base2定义了虚析构函数,删除b2p的时候,不但调用了基类析构函数,还调用了派生类析构函数。因该注意调用的顺序。