Проблемы с наследованием в STL

В http://www.stepanovpapers.com/notes.pdf Александр Степанов упоминает:

Интересно отметить, что единственные примеры наследования, которые остался в STL наследовать от пустых классов. Первоначально много применений наследования внутри контейнеров и даже итераторов, но они должны были быть удалены из-за проблем, которые они вызвали.

Каковы технические проблемы, которые препятствовали использованию наследования в STL?

Ответ 1

Думаю, что я сделаю несколько комментариев непосредственно от Александра Степанова (http://www.stlport.org/resources/StepanovUSA.html).

Вопрос:

STL полна творческих применений шаблонов, таких как символические типы, экспортируемые из классов, или соответствие шаблону набора перегруженные алгоритмы на теги итератора. Разумеется, ни один стандарт С++ Книга программирования говорит об этих идиомах. Как вы пришли эти идиомы кода на С++?

Ответ:

Я точно знал, чего я пытаюсь выполнить. Поэтому я исправил язык, пока я не смог пройти. Но мне потребовалось много лет, чтобы найти все методы. И у меня было много ложных запусков. Например, Я потратил годы, пытаясь найти какое-то использование для наследования и виртуальных машин, прежде чем я понял, почему этот механизм был в корне ошибочным и не следует использовать. Я очень рад, что никто не мог увидеть все промежуточные этапы - большинство из них были очень глупыми. Мне нужны годы придумать что-нибудь наполовину приличное. Это также помогло Бьярне желая добавить определенные функции на этом языке, чтобы мои идиомы. Он однажды назвал его "как раз вовремя".

Затем я позволю себе направить вас на этот великий ответ:

fooobar.com/info/34736/...

ООП не является святым Граалем. Это милая идея, и это было довольно совершенствование процедурных языков еще в 70 году, когда оно было изобрел. Но это, честно говоря, не все, что она треснула. Во многих случаев он неуклюжий и многословный, и он на самом деле не способствует многоразовому кода или модульности.

Вот почему сообщество С++ сегодня гораздо больше интересуется родовыми программирования, и почему все, наконец, начинают понимать, что функциональное программирование довольно умное. ООП самостоятельно не очень красивое зрелище.

А теперь что-то от меня:

Правила ООП определяют способ (наследование, полиморфизм и т.д.) программист думает о взаимодействии между вещами (объектами, сущностями, триблями и т.д.).

Это ясно видно на этом простом примере Java со времени, прежде чем добавить поддержку дженериков (но они не такие подробные, как в С++).

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
Александр Степанов признал, что общий подход может решить эту проблему, помочь в обеспечении логического разделения (абстракции) между структурами данных и алгоритмами. Вот почему так много внимания уделяется итераторам, функторам и многим другим идиомам, которые очень хорошо вписываются в общий мир.