8

考虑

class A
{
public:
   virtual void foo () = 0;
};

在这一点上,它绝对A是一个抽象类,并且永远不会被自己实例化。那么为什么标准不要求自动生成的析构函数也必须是虚拟的呢?

每次我需要在我的接口类中定义一个虚拟的虚拟描述符时,我都会问自己这个问题,但我不明白为什么 commetee 不这样做。

那么问题来了:为什么抽象类中生成的析构函数不是虚拟的?

4

3 回答 3

8

因为在 C++ 中,您不需要为不需要的东西付费,而且虚拟析构函数会增加很多情况下不需要的开销(即使在已经多态的类中也是如此)。例如,您可能不需要多态破坏,而是选择使用受保护的析构函数。

此外,作为一种替代方案,假设您有一个带有虚拟方法的类,它确实需要多态破坏。现在想象一下,virtual不再需要并删除其他方法,但仍然需要多态破坏。现在您必须记住返回并添加虚拟析构函数或遭受未定义的行为。

最后,我认为很难根据类是否为多态来证明更改析构函数的默认虚拟性(以及单独的)是合理的,而不是始终且始终如一地使析构函数非虚拟,除非另有要求。

于 2012-11-14T18:48:36.220 回答
0

每次销毁此类时,虚拟析构函数都会导致取消引用。相当小的开销,但 C++ 希望尽可能多地节省时间。无论如何,显式总是比相信隐式编译器魔法更好。C++ 的座右铭:“信任程序员”。

LG ntor

于 2012-11-14T18:58:51.347 回答
0

在编写 c++ 标准时,我牢记它将在各种平台上使用。其中一些可能有内存限制。通过添加虚拟主义,我们增加了开销。这就是为什么当时每个方法/dtor 都需要由程序员明确地设为虚拟,无论何时我们确实需要多态性。

现在问题来了,为什么抽象类默认析构函数不能标准c++实现。你不觉得有不同的实现会很奇怪,而且会引起混乱。那么情况(不管它有多小),当你不需要析构函数是虚拟的(为了节省内存)。为什么要浪费记忆

于 2013-05-03T09:58:55.153 回答