//首先,我们定义了A类
class A
{
public:
~A()
{
cout << "~A()" << endl;
}
private:
char * a;
};
//然后定义B类,B类继承自A类
class B : public A
{
public:
~B()
{
cout << "~B()" << endl;
}
private:
char * b;
};
我们在main函数中定义
int main()
{
A * p = new B();
delete p;
return 0;
}
执行
结果是只是调用了类A的析构函数,类B的未调用,如图
接下来,我们将基类中的析构函数声明成虚函数,派生类就不用再声明了,他在派生类中将自动成为虚方法。然而,在派生类中使用关键字virtual来指出哪些函数是虚函数也不失为一个好方法。
class A
{
public:
virtual ~A()
{
cout << "~A()" << endl;
}
private:
char * a;
};
我们再次执行main方法,结果可想而知了。
总结:
我们为什么应该把析构函数定义为虚函数。如果析构函数不是虚的,则将只调用指针类型的析构函数。对于第一次运行程序时,以为着只有A的析构函数被调用,即使指针指向了的时B对象,如果析构函数定义为虚的,将调用相应对象类型的析构函数。因此,如果指针指向的时B对象,将调用B的析构函数,然后自动调用基类A的析构函数。
因此,使用虚析构函数可以确保正确的析构函数被调用。