【发布时间】:2011-06-12 20:00:58
【问题描述】:
众所周知,STL 类在任何地方都不使用虚方法(STL 也不在任何地方使用继承,而且这两个事实是相互关联的),而且 STL 并不是唯一的。
让我们假设地球上存在其他性能怪胎[他们确实存在],这些性能怪胎在每个类都问自己“我需要这个类 X 的虚拟方法吗?”和“这个类 X 是否可以像 STL 类一样在没有任何虚拟的情况下实现更好的性能?”
缺少任何虚拟方法(包括 d'tor)使得多态性和子类化比使用“虚拟”基类更加困难。显然,“非虚拟”类不非常适合作为基类。
问题:是否有技术(用于 c++)允许程序员一次性创建相同类 X 的两个版本,一个“非虚拟”版本 Xnv(用于性能)和“虚拟” “版本 Xv,用于子类化?如果不需要,请说明原因。
Post-note
人们回答 “如果您需要子类化,请使用 virtuals。如果不需要,请不要使用 virtuals”。
这个建议有问题。几个问题。
1) 需求随着时间而变化。那时不需要从类 X 子类化,但现在需要,反之亦然。
2) 编写基类的人与编写派生类的人不同。从问题中可以清楚地看出这一点。人们有不同的思维类型、不同的判断、不同的需求。再次清除。
3) 因此,不同的程序员在回答“从类 X 继承是否有意义?”之类的问题时,会给出不同的答案。这是主观的,没有一成不变的答案。
4)它与问题的要求相矛盾。
因此,我们希望满足频谱的两端——这在工程中经常发生——这就是问题背后的动机。
动机过于复杂,无法在问题中简明扼要地表达出来。我假设人们可以(1)假设存在动机,因为问题是精确制定的,或者可以(2)计算动机,因为他们已经处于 c++ 设计的类似权衡和平衡情况。
没有人想出动机——令我惊讶的是——即使是现在。这对我来说是一个教训。
我接受了提到 CRTP 的答案,因为它很有趣。
【问题讨论】:
-
如果您不需要虚拟,为什么要添加它们?如果你需要它们,你就需要它们。
-
一些 STL 类确实使用虚拟方法 ...例如
std::streambuf -
@smerlin:标准库和STL存在一些混淆和争论,其中STL是指的是最初由 Stepanov 实现的库(容器、迭代器、算法......)。
std::streambuf(如std::iostream和其他)是 标准库 的一部分,但不是 STL -
@David:严格来说,在 C++ 语言的上下文中,没有 STL 这样的东西。说某些部分绝对属于 STL,而另一些部分似乎从一开始就没有道理。
-
与您的断言相反,STL 确实使用虚拟方法,并且确实使用继承。与您的主要假设相反,效率通常不是使方法虚拟与否的考虑因素。我想说这个问题需要重新思考。
标签: c++ performance inheritance stl