构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。
不建议在构造函数和析构函数里面调用虚函数。
构造函数不能申明为虚函数,否则编译器报错,原因在于对象实例化是需要知道确切的类的类型,如果构造函数为虚函数将不知道具体构造基类函数还是继承类函数,所以构造函数不能为虚函数。
基类的虚函数应该设置为虚函数,如果基类函数不为虚函数,在用基类指针delete时,只会调用基类的虚构函数,而不会调用派生类的析构函数,导致派生类中的新的资源未被清理,造成内存泄露。
举个栗子:
<pre>
include <iostream>
using namespace std;
class Base{
public:
Base(){cout<<"Base"<<endl;};
Base(){cout<<"Base"<<endl;}
} ;
class A:public Base{
public:
A(){cout<<"A"<<endl;}
virtual A(){cout<<"A"<<endl;}
};
class B:public A
{
public:
B(){
cout<<"B"<<endl;
}
~B(){
cout<<"~B"<<endl;
}
};
int main()
{
Base *a=new B;
delete a;
return 0;
}
//输出 //vs2013报debug错误,可能和编译器有关
Base
A
B
~Base
</pre>
将~Base()声明为virtual后,
//输出
Base
A
B
~B
~A
~Base
结论:
因此在类的继承体系中,基类的析构函数不声明为虚函数容易造成内存泄漏。所以如果你设计一定类可能是基类的话,必须要声明其为虚函数。