为什么抽象类的默认设计器不是虚拟的

Why default destuctor for an abstract class is not virtual?

本文关键字:虚拟 抽象类 默认 为什么      更新时间:2023-10-16

>考虑

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

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

每当我需要在我的接口类中定义一个虚拟虚拟 desctuctor 并且不明白为什么 commetee 不这样做时,我都会问自己这个问题。

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

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

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

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

虚拟

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

乐金

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

现在问题来了,为什么不能标准C++实现抽象类默认析构函数。你不觉得有不同的实现会很奇怪,也会引起混乱吗?那么情况呢(无论它有多小),当你不需要析构函数是virtaul(以节省内存)时。为什么要浪费内存