可以自动将默认析构函数生成为虚拟析构函数吗?

时间:2009-07-13 02:03:34

标签: c++ destructor

默认析构函数是否可以自动生成为虚拟析构函数?

如果我定义了一个基类但没有默认的析构函数,那么是否存在默认的虚析构函数 自动生成?

7 个答案:

答案 0 :(得分:49)

在C ++ 11中,您可以使用:

class MyClass
{
  // create a virtual, default destructor
  virtual ~MyClass() = default;
};

答案 1 :(得分:45)

没有。将方法设为虚拟会产生相关成本,而C ++的理念是不会让您为未明确声明要使用的内容付费。如果自动生成虚拟析构函数,您可能会自动支付价格。

为什么不定义一个空的虚拟析构函数?

答案 2 :(得分:9)

不,所有析构函数默认都不是虚拟的。

您需要在所有基类上定义虚拟析构函数

除此之外。

引用Scott Meyers的书“Effective C ++”:

  

C ++语言标准是   关于这个话题非常清楚。什么时候   您尝试删除派生类   通过基类指针对象   并且基类具有非虚拟   析构函数(如EnemyTarget所做),   结果未定义

实际上,如果您认为有人可能最终会从中创建派生类,那么通常使用虚拟析构函数定义类通常是个好主意。无论如何,我倾向于让所有类都有虚拟析构函数。是的,存在与此相关的成本,但是不会使其虚拟化的成本往往不会影响运行时间的开销。

我建议,只有当你完全确定你想要那种方式而不是依赖于编译器强制执行的默认非虚拟时,才使它成为非虚拟的。你可能不同意(但总结)我最近在一些遗留代码上有一个可怕的内存泄漏,我所做的就是将std :: vector添加到已经存在了几年的其中一个类中。事实证明,其中一个基类没有定义析构函数(默认析构函数为空,非虚拟!),并且没有内存被分配,因为在此之前没有内存泄漏。经过多天的调查和浪费时间......

答案 3 :(得分:9)

是的,通过从具有虚析构函数的基类继承。在这种情况下,您已经为多态类(例如vtable)支付了价格。

答案 4 :(得分:8)

Uri和Michael是对的 - 我只想补充一点,如果你不得不触摸两个文件来声明和定义析构函数,那么在标题中定义一个最小的内联是完全正确的:

class MyClass
{
   // define basic destructor right here
   virtual ~MyClass(){}

   // but these functions can be defined in a different file
   void FuncA();
   int FuncB(int etc);
}

答案 5 :(得分:2)

目前, Uri 是对的。另一方面,在您的类中声明了一个虚方法之后,无论如何都要为虚拟表的存在付出代价。实际上,如果您的类具有虚方法但没有虚拟析构函数,编译器将警告您。这可能成为自动生成默认虚拟析构函数的候选者,而不是讨厌的警告。

答案 6 :(得分:1)

没有。您需要将其声明为虚拟。

相关问题