【发布时间】:2010-09-26 02:41:15
【问题描述】:
Java 和 C# 支持不能用作带有 final 和 sealed 关键字的基类的类的概念。然而,在 C++ 中,没有很好的方法来防止类派生,这让类的作者陷入两难境地,每个类都应该有一个虚拟析构函数吗?
编辑:由于 C++11 不再适用,您可以指定一个类为 final。
一方面,给对象一个虚拟析构函数意味着它将有一个vtable,因此每个对象为vptr消耗4个(或在64位机器上为8个)额外字节。
另一方面,如果后来有人从这个类派生并通过指向基类的指针删除派生类,则程序将定义不正确(由于没有虚拟析构函数),坦率地说,为指针优化每个对象都是荒谬的。
在gripping hand 上,有一个虚拟析构函数(可以说)表明这种类型是为了多态使用。
有些人认为你需要一个明确的理由不使用虚拟析构函数(就像this question 的潜台词)而其他人说你应该只在你有理由相信你的类是从,你怎么看?
【问题讨论】:
-
已经有问题询问利弊 - 这是重复的,还是打算作为民意调查?如果是后者,也许您应该为投票创建“是”和“否”答案,然后关闭问题?我认为这是对 SO 实施多项选择投票的推荐方式。
-
“坦率地说,为每个对象优化一个指针是荒谬的。” - 对于小对象来说并不荒谬。 C++0x 正在添加一个容器 forward_list,正是因为有时每个对象一个指针的开销太大——从空间和时间要求来看。
-
@onebyone,这个问题不是你列出的第一个问题的重复,它是特定于 abstract 类的,我在我的问题中引用了第二个问题,我没有认为这是重复的,因为这个问题强烈偏向于虚拟 dtors 我想要一个公开讨论。
-
@Kyralessa,极客必须做极客必须做的事情:)