c++ - 每个类都应该有一个虚拟析构函数吗?

标签 c++ virtual-destructor

Java 和 C# 支持不能用作带有 finalsealed 关键字的基类的类的概念。然而,在 C++ 中,没有很好的方法来防止类派生,这让类的作者陷入两难境地,每个类都应该有一个虚拟析构函数吗?


编辑: 由于 C++11 不再适用,您可以指定一个类为 final .


一方面,给一个对象一个虚拟析构函数意味着它将有一个 vtable 并且因此为 vptr< 每个对象消耗 4 个(或在 64 位机器上为 8 个)额外字节

另一方面,如果后来有人从这个类派生并通过指向基类的指针删除派生类,则程序将是错误定义的(由于没有虚拟析构函数),坦率地说,为指针优化每个对象都是荒谬的。

gripping hand 拥有一个虚拟析构函数(可以说)表明这种类型是为了多态使用。

有些人认为你需要一个明确的理由才能不使用虚拟析构函数(this question 的潜台词也是如此),而其他人则认为只有当你有理由相信你的类是从,怎么看?

最佳答案

每个抽象类都应该有一个,

  • protected 析构函数,或者,
  • 虚拟析构函数。

如果您有一个公共(public)的非虚拟析构函数,那就不好了,因为它允许用户通过该指针删除派生对象。众所周知,这是未定义的行为。

对于抽象类,您已经需要对象中的虚拟表指针,因此使析构函数 virtual 不会(据我所知)在条款方面具有高成本空间或运行时性能。它的好处是派生类自动拥有它们的析构函数virtual(参见@Aconcagua 的评论)。当然,对于这种情况,你也可以将析构函数设为protected virtual

对于不打算通过指向它的指针删除的非抽象类,我认为没有充分的理由使用虚拟析构函数。它会浪费资源,但更重要的是它会给用户一个错误的提示。想想给 std::iterator 一个虚拟析构函数会有什么奇怪的意义。

关于c++ - 每个类都应该有一个虚拟析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/353817/

相关文章:

c++ - 为什么我的 map 打印全为零?

c++ - VideoCapture 未检测到 uEye 摄像头

c++ - 虚函数可以内联吗

c++ - 具体类的析构函数

c++类型转换以获得访问权限

c++ - 是否可以垂直同步单个缓冲上下文?

c++ - 使用 SFML 绘制曲线会给出错误的形状

c++ - C++ 编译器将为函数参数执行的各种自动类型转换的完整列表是什么?

c++ - 通过基类列表调用派生类对象的析构函数

c++ - 虚继承中的析构函数