为什么抽象类的默认设计器不是虚拟的
Why default destuctor for an abstract class is not virtual?
>考虑
class A
{
public:
virtual void foo () = 0;
};
在这一点上,绝对明显的是,A
是一个抽象类,永远不会自行实例化。那么,为什么标准不要求自动生成的析构函数也必须是虚拟的呢?
每当我需要在我的接口类中定义一个虚拟虚拟 desctuctor 并且不明白为什么 commetee 不这样做时,我都会问自己这个问题。
那么问题来了:为什么抽象类中生成的析构函数不是虚拟的?
因为C++你不需要的东西付费,虚拟析构函数会增加在许多情况下不需要的开销(即使在已经多态的类中)。例如,您可能不需要多态销毁,而是选择使用受保护的析构函数。
此外,作为替代方案,假设您有一个类,其中包含一个确实需要多态破坏的虚拟方法。现在想象一下,不再需要并删除了另一种virtual
方法,但仍需要多态破坏。现在,您必须记住返回并添加虚拟析构函数,否则将遭受未定义的行为。
最后,我认为很难根据类是否是多态的来证明更改析构函数(并且仅更改它)的默认虚拟性是合理的,而不是总是并且始终如一地使析构函数非 vurtual,除非另有要求。
析构函数每次销毁此类时都会导致取消引用。开销相当小,但C++希望节省尽可能多的时间。无论如何,显式总是比信任隐式编译器魔法更好。C++的座右铭是:"相信程序员"。
乐金
当编写 c++ 标准时,它是通过牢记它将在各种平台上使用来编写的。其中一些可能有内存限制。通过添加虚拟主义,我们正在增加开销。这就是为什么当时每个方法/dtor都需要由程序员明确地虚拟,每当我们需要多态性时。
现在问题来了,为什么不能标准C++实现抽象类默认析构函数。你不觉得有不同的实现会很奇怪,也会引起混乱吗?那么情况呢(无论它有多小),当你不需要析构函数是virtaul(以节省内存)时。为什么要浪费内存
- C++:从抽象类重写纯虚拟运算符重载
- 错误消息:不允许抽象类类型 "X" 的对象:纯虚拟"Y"没有覆盖器
- 纯抽象类的虚拟破坏者
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 抽象类和虚拟构造函数的替代方案
- 我将如何通过抽象类传递虚拟方法,但可以选择不重写
- 抽象类对象和纯虚拟析构函数
- 本地抽象类的纯虚拟析构函数
- 返回虚拟函数的静态成员,对于抽象类缺少VT
- 我可以让虚拟抽象类抛出一个异常吗?
- C++:具有成员的抽象类中的纯虚拟析构函数
- 虚拟类和抽象类在C++有什么用
- 为什么抽象类的默认设计器不是虚拟的
- 在C 抽象类中实现回调(对于C库)为纯虚拟
- 为什么抽象派生类需要初始化虚拟基类?
- 使用纯虚拟方法在C 中初始化抽象类
- 如何重写调用另一个抽象类的抽象类的虚拟函数
- C++ 抽象类是否应该为(虚拟)析构函数提供实现
- 为什么我们需要抽象类而不是虚拟类
- 为什么纯虚拟/抽象类需要构造函数,特别是对于受保护的const成员变量