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