构造函数:不行
原因:
1、因为创建一个对象时要确定对象的类型,而虚函数是在运行时确定其类型的,而在构造一个对象时,由于对象还未创建成功,编译器无法知道对象的实际类型。
2、虚函数对应一个虚表,可是这个虚表其实是存储在对象的内存空间的。如果构造函数是虚的,就需要通过虚表来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找虚表呢?所以构造函数不能是虚函数。
析构函数:可以
原因:
1、在多态当中,基类的方法被定义成 虚函数,才可以通过基类指针动态调用派生类的方法,同理当我们delete 基类指针,如果基类析构函数不是虚函数,就无法动态调用到派生类的析构函数,导致派生类的对象无法析构,造成内存泄漏。反之,基类析构函数被定义成 虚函数的时候,delete基类指针时,会先 析构派生类对象,再 析构基类对象。
示例:
#include
using namespace std;
class FatherA
{
private:
/* data */
public:
FatherA(/* args */){}
~FatherA()
{
cout << "我不是虚函数,正在析构基类FatherA"<
};
class FatherB
{
private:
/* data */
public:
FatherB(/* args */){}
virtual ~FatherB()
{
cout << "我是虚函数,正在析构基类FatherB"<
};
class Child:public FatherA,public FatherB
{
private:
/* data */
public:
Child(/* args */);
~Child();
};
Child::Child(/* args */)
{
}
Child::~Child()
{
cout << "析构派生类child"<
int main() cout<<"start delete B"<
{
FatherA *A = new Child();
FatherB *B = new Child();
cout<<"start delete A"<
cout<<"end delete A"<
cout<<"end delete B"<
return 0;
}