析构函数什么时候为虚函数
通常来说,析构函数使用普通的成员函数形式(若定义为虚函数需要增加虚函数表当开销)即可,但是当一个类为基类当时候就需要将该类当析构函数定义为虚函数。原因是当基类的析构函数不为虚函数时,删除基类指针的时候,不会自动调用子类的析构函数,导致内存泄漏。
class A
{
public:
A(){};
virtual ~A(){};
virtual void DoSomething(){cout<<"A do something!"<<endl;};
};
class B: public A
{
public:
B(){};
~B(){cout<<"B destructor act"<<endl;};
void DoSomething(){cout<<"B do something!"<<endl;};
};
int main()
{
A *a = new B();
a->DoSomething();
delete a;
return 0;
}
输出的结果为:
B do something!
B destructor act
当去掉A中当析构函数后,得到的结果为:
B do something!
也就是B没有调用析构函数,导致内存泄漏!