写成虚的是为了在实现多态的时候不造成内存泄露,
如果基类析构函数前不加vitual,派生类对象被销毁后,只会调用基类的析构函数,而不会去调用派生类的析构函数。
比如:
class a
{
int aa;
public:
virtual ~a(){};
};
class b : public a
{
int *bb;
};
如果你这样:
a *pa = new b; // upcast
然后这样:
delete pa;
这句delete, 如果你基类的析构函数不是虚的的话, 就会造成内存泄露, ///具体表现为派生类的内存被释放了而基类没有.
最后一句更正为
pa调用了基类的析构函数 而没有调用class b中的析构函数