美文网首页
C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

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

作者: 李里里Riss | 来源:发表于2017-03-14 17:28 被阅读0次

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

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

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

相关文章

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

    构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用...

  • C++虚函数的一些奇怪问题总结

    构造函数能否为虚函数?在构造函数中调用虚函数会如何?析构函数能否为虚函数?析构函数能否为纯虚函数?其实日常开发中基...

  • 构造函数和析构函数可以是虚函数吗

    构造函数不能是虚函数,析构函数可以且常常是虚函数。 构造函数不能是虚函数 存储空间角度虚函数的调用需要 vptr ...

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

  • 2002.C++BASE-构造函数、析构函数

    转:C++继承中构造函数、析构函数调用顺序及虚析构函数 1.构造函数 大家都知道构造函数里就可以调用成员变量,而继...

  • ★03.关于单继承

    基类总是要写虚析构函数 通过设置析构函数为纯虚函数来让类称为抽象基类 代码 函数virtual属性的传递性 拷贝移...

  • c++primer 15.24-15.30

    15.24基类一般定义一个虚析构函数但是虚析构函数会阻止移动操作但是虚析构函数会帮助基类派生类体系动态销毁对象15...

  • C++ 多态性 虚函数、抽象类(二)

    注意:本文中代码均使用 Qt 开发编译环境 在C++中不能声明虚构造函数,但是可以声明虚析构函数。析构函数没有类型...

  • 简介python中的析构函数与构造函数

    python的构造和析构函数为固定的名字。 构造函数 析构函数 不像c++中那样构造函数和析构函数是类名字。并且在...

  • C++的虚析构函数

    首先,我们必须知道,虚析构函数是有其本身的目的,所以正常情况下,我们不应该声明虚析构函数。 构造函数和析构函数是一...

网友评论

      本文标题:C++中,构造函数不能设为虚函数,基类析构函数应该设为虚函数

      本文链接:https://www.haomeiwen.com/subject/tsihnttx.html