Java 和 C# 支持不能使用 final
andsealed
关键字作为基类的类的概念。然而,在 C++ 中,没有很好的方法来防止派生一个类,这让类的作者陷入两难境地,每个类都应该有一个虚拟析构函数吗?
编辑:由于 C++11 这不再是真的,你可以指定一个类是final
.
一方面,给一个对象一个虚拟析构函数意味着它将有一个vtable
,因此每个对象会消耗 4 个(或 64 位机器上的 8 个)额外字节vptr
。
另一方面,如果后来有人从这个类派生并通过指向基类的指针删除派生类,则程序将是错误定义的(由于没有虚拟析构函数),坦率地说,为每个对象优化一个指针是荒谬的。
在具有虚拟析构函数的抓手上(可以说)表明这种类型旨在以多态方式使用。
有些人认为你需要一个明确的理由不使用虚拟析构函数(这是这个问题的潜台词),而另一些人则说只有当你有理由相信你的类将派生自你时才应该使用它们,你是什么思考?