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

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


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


一方面,给一个对象一个虚拟析构函数意味着它将有一个 vtable 并且因此为 vptr。

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

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

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

最佳答案

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

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

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

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

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

https://stackoverflow.com/questions/353817/

相关文章:

c++ - C中有const吗?

c++ - 复制 std::vector:更喜欢赋值还是 std::copy?

c++ - 什么时候需要 "typename"关键字?

c++ - C++ 中的 vector ::size_type

c++ - C 样式字符串作为模板参数?

c++ - 链接上 undefined symbol ___gxx_personality_v0

c++ - 是否有用于检测 C++11x 支持的预处理器指令?

c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?

c++ - 如何遍历打包的可变参数模板参数列表?

c++ - 调用函数时切换 "transfer of control bypasses initia