虚析构函数:可通过基类指针删除派生类对象
#include<iostream>
using namespace std;
class Base
{
public:
Base(int x)
{
q = new int;
*q = x;
}
virtual ~Base()
{
printf("Base\n");
//delete q 如果加上这个语句,这个程序就会崩溃,因为后面析构时q被释放了两次
}
int *q;
};
class Derived: public Base
{
public:
Derived(int x): Base(x)
{
p = new int;
*p = x;
}
virtual ~Derived()
{
printf("Derived\n");
delete p;
delete q; //其实这样做是极度不完全的,q是基类的指针,就应该在基类的析构函数里面被释放!
}
private:
int *p, *z;
};
int main(void)
{
Base *b = new Derived(15);
Derived *q = new Derived(16);
delete b; //注意在调用完派生类的析构函数之后,仍然会再次调用基类的析构函数,如果Base类中的析构函数不声明为虚函数,那么就只会调用基类析构函数
b = q;
printf("%d %d\n", sizeof(*b), sizeof(*q));
delete b;
return 0;
}
/*
输出结果:
Derived
Base
8 16
Derived
Base
*/