在http://www.stepanovpapers.com/notes.pdf中,Alexander Stepanov提到:
有趣的是要注意继承的唯一例子 留在STL继承空类。最初,有 在容器甚至迭代器中使用继承的许多用途,但是 由于他们造成的问题,他们不得不被移除。
哪些技术问题妨碍了在STL中使用继承?
答案 0 :(得分:4)
我想我会直接从Alexander Stepanov(http://www.stlport.org/resources/StepanovUSA.html)发表一些评论。
问题:
STL充满了模板的创造性用途,例如符号 从类导出的类型,或者一组的模式匹配 将算法重载到迭代器标记上。当然,没有标准 C ++编程书谈到了这些习语。你是怎么来的 这些C ++代码成语?
答案:
我确切地知道我想要完成的事情。所以我调整了一下 语言,直到我能够通过。但我花了很多年才到 发现所有技术。我有许多错误的开始。例如, 我花了数年时间试图找到继承和虚拟的一些用途, 在我明白为什么这种机制存在根本缺陷之前 不应该使用。我很高兴没有人能看到所有的 中间步骤 - 大多数都非常愚蠢。这需要我几年 拿出任何一半体面的东西。它也帮助了Bjarne 愿意在语言中添加某些功能只是为了启用某些功能 我的成语。他曾经把它称为"只是及时的语言设计。"
接下来,我将允许自己引导您找到这个好的答案:
https://stackoverflow.com/a/1039904/210971
OOP不是圣杯。这是一个可爱的想法,而且非常简单 程序语言的改进早在70年代就已存在 发明的。但说实话,并不是所有人都能解决这个问题。在很多 它是笨拙和冗长的,它并没有真正促进可重复使用 代码或模块化。这就是为什么今天的C ++社区对泛型更感兴趣 编程,以及为什么每个人终于开始意识到这一点 函数式编程也很聪明。 OOP本身就是 不是一个美丽的景象。
现在来自我的一些事情:
OOP规则规定了程序员思考事物(对象,实体,tribbles等)之间交互的方式(继承,多态等)。
在添加对泛型的支持之前,这个简单的Java示例清楚地显示了这一点(但这些并不像在C ++中那样冗长)。
List v = new ArrayList();
v.add("test");
Integer i = (Integer)v.get(0); // Run time error
虽然代码编译时没有错误,但在执行第三行代码时会抛出运行时异常(java.lang.ClassCastException)。使用泛型可以避免这种类型的问题,并且是使用泛型的主要动机。
List<String> v = new ArrayList<>();
v.add("test");
Integer i = v.get(0); // (type error) compilation-time error
Alexander Stepanov认识到通用方法可以解决这个问题,有助于在数据结构和算法之间提供逻辑分离(抽象)。这就是为什么非常重视迭代器,算子和许多其他非常适合通用世界的习语。