STL中的继承问题

时间:2016-02-16 16:27:37

标签: c++ inheritance stl

http://www.stepanovpapers.com/notes.pdf中,Alexander Stepanov提到:

  

有趣的是要注意继承的唯一例子   留在STL继承空类。最初,有   在容器甚至迭代器中使用继承的许多用途,但是   由于他们造成的问题,他们不得不被移除。

哪些技术问题妨碍了在STL中使用继承?

1 个答案:

答案 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认识到通用方法可以解决这个问题,有助于在数据结构和算法之间提供逻辑分离(抽象)。这就是为什么非常重视迭代器,算子和许多其他非常适合通用世界的习语。