C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。
不建议在构造函数和析构函数里面调用虚函数。
构造函数不能申明为虚函数,否则编译器报错,原因在于对象实例化是需要知道确切的类的类型,如果构造函数为虚函数将不知道具体构造基类函数还是继承类函数,所以构造函数不能为虚函数。

基类的虚函数应该设置为虚函数,如果基类函数不为虚函数,在用基类指针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

结论:
因此在类的继承体系中,基类的析构函数不声明为虚函数容易造成内存泄漏。所以如果你设计一定类可能是基类的话,必须要声明其为虚函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址:新浪博客 | zjdtc | 虚函数与构造函数、析构函数 | 2011-06-22本文在原文之上,增加了...
    蓝雪冬荷阅读 1,007评论 0 0
  • 转:C++继承中构造函数、析构函数调用顺序及虚析构函数 1.构造函数 大家都知道构造函数里就可以调用成员变量,而继...
    资深小夏阅读 731评论 0 0
  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 1,755评论 4 19
  • 1. 让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言:...
    Mr希灵阅读 2,859评论 0 13
  • 看了一个综艺节目<见字如面>看到蔡琴写给前夫杨德昌的信所感 2007年,报上刊出了杨德昌因癌病逝世的消息,也刊出了...
    冰心来一壶阅读 1,029评论 0 0