构造函数、析构函数是否要声明为虚函数的问题(网络转载)

构造函数不能声明为虚函数的原因是:
解释一:所谓虚函数就是多态情况下只执行一个,而从继承的概念来讲,总是要先构造父类对象,然后才能是子类对象,如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造,还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错.

解释二:虚函数的主要意义在于被派生类继承从而产生多态. 派生类的构造函数中, 编译器会加入构造基类的代码, 如果基类的构造函数用到参数, 则派生类在其构造函数的初始化列表中必须为基类给出参数, 就是这个原因.



析构函数设为虚函数的作用:
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。

例:

#include "stdafx.h"

#include "stdio.h"

class A
{
public:

A();
virtual ~A();

};
A::A()
{

}

A::~A()
{

printf("Delete class AP/n");

}
class B : public A
{
public:
B();
~B();

};

B::B()
{

}

B::~B()
{
printf("Delete class BP/n");
}
int main(int argc, char* argv[])
{
A *b=new B;
delete b;
return 0;

}

输出结果为:Delete class B
Delete class A

如果把A 的virtual 去掉:
那就变成了Delete class A

因此析构函数不声明为虚函数容易造成内存泄漏。

你可能感兴趣的:(网络,delete,Class,编译器)