Java 和 C# 支持不能用作带有 final
和 sealed
关键字的基类的类的概念。然而,在 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/