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

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

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

没有。与虚拟方法相关的成本是相关的,而C ++的理念是不会让你付出你没有明确说明你想要使用的东西。 如果虚拟析构函数是自动生成的,那么您将自动支付价格。

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

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

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

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

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

在此之上。

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

C ++语言标准在这个话题上exception清晰。 当您尝试通过基类指针删除派生类对象并且基类具有非虚拟析构函数(如EnemyTarget所做的那样)时,结果是未定义的

在实践中,如果你认为有人可能最终从中创build一个派生类,那么定义一个具有虚拟析构函数的类通常是个好主意。 无论如何,我倾向于让所有类都具有虚拟析构函数。 是的,有一个与此相关的成本,但没有使虚拟化更经常的成本,并没有超出运行时间的开销。

我build议,只有当你完全确定你需要这种方式而不是虚拟化,而不是依靠编译器强制执行的默认非虚拟化方法时,才会使它变得非虚拟化。 然而,你可能不同意(总之),我最近在一些遗留代码上有一个可怕的内存泄漏,我所做的只是将一个std :: vector添加到已经存在了几年的类中。 事实certificate,它的一个基类没有定义析构函数(默认的析构函数是空的,非虚拟的!),因为没有内存像这样被分配,直到没有内存泄漏。 后来多less天的调查和时间浪费了…

是的,通过从虚拟析构函数inheritance基类。 在这种情况下,您已经为多态类(例如vtable)付出了代价。

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); } 

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

不需要,你需要声明它是虚拟的。