1) В С++ возможно "виртуальное" наследование:
Код:
class A
: public BB
: virtual public CC
{ } ;
В случае BB предки будут размножаться. В случае CC -- не будут.
2) Вы большой сторонник чистоты языка. Это тоже не ново: в 1976 году вышло "Пересмотренное сообщение об Алголе-68". Там многие неэлегантности и избыточные черты были убиты на корню. А люди предпочли не стройность, а практичность. Может быть потому, что программы пишут, а не поэмы. Этим-то и жив и процветает мной нелюбимый Perl -- в нем каждый находит свой любимый стиль. А из Java можно было бы выкинуть треть, следуя принципу неизбыточности. И читаемость бы не ухудшилась.
Со временем пропадает желание поучать, как следует программировать. Сменяются языки, и то, что когда-то казалось почти идеалом, перестает удовлетворять. Потом и это проходит
. Простите, пофилософствовать потянуло.
3) Когда человек осваивает новый язык, он, естественно, ищет в нем способы решения старых задач. Именно поэтому мало прочитать LRM. Но сводить этот поиск к эффекту привычки -- неправильно. Это активное освоение идиоматики языка.
Здесь же замечу, что чистых языков мало, они слишком не практичны. Я бы, пожалуй, назвал Forth -- обратная польская запись в чистом виде, может быть Lisp -- как функциональный язык.
Я не знаю ни одного чистого ОО языка! Все известные мне "ОО" языки срочно становятся традиционными, когда речь заходит об арифметике (ух, как не ОО!). Более того, они испытывают непреодал
енные трудности в реализации именно объектной модели -- к примеру, множественные ассоциации и объекты (методы) связанные с ассоциацией (их приходиться приклеивать лейкопластырем к одному из объектов).
Поэтому появление шаблонов -- вряд ли эрозия. Скорее, требование жизни. Я уже пытался обратить Ваше внимание на то, что шаблоны новее ОО языков, добавляются в них после создания (за исключением C#). Рискну высказать идею -- появяться способы потребовать в шаблоне реализацию классом-параметром необходимого интерфейса, или набора интерфейсов. И, таким образом, будет заметно улучшена диагностика шаблонов. Или же шаблоны исчезнут, если будут найдены лучшие методы выполнения функций, которые они выполняют сейчас (так исчезла передача параметра по наименованию -- вряд ли многие вспомнят что это такое или чем она плоха).
4) Ваша концепция базового класса -- "самый родной член" -- несколько неортодоксальна, по меньшей мере, не общепринята. Одно время в плохих книжках было модно вводить класс
Точка с методом
переместить(), а затем из него выводить классы
Круг,
Квадрат -- в которых эта точка служит центром. На сегодняшний день самой популярной является концепция "разновидности" -- то есть, если есть класс
Человек, мы из него можем вывести класс
Мужчина -- ибо
Мужчина есть разновидность
Человека, всяк
Мужчина --
Человек. В противоположность этому, мы не можем вывести класс
Мужчина из класса
Голова -- хотя у большинства и есть голова на плечах. Мы можем также вывести класс
Мужчина из класса
Самец, и, понятно, что
Мужчина имеет и черты
Самца, и черты
Человека. Но ни
Человек, ни
Самец не являются "самыми родными членами" -- это классы, к которым можно отнести мужчин. Врядли можно сказать однозначно, чего в
Мужчине больше --
Человека или
Самца (зависит от ситуации, не так ли?). Поэтому приходиться соглашаться, что больше, чем один класс. А интерфейсов у
Мужчины много, и не все они наследуются из классов-предков -- например,
Отец есть весьма специфический интерфейс.
5) Что же непонятно с разницей передачи класса и объекта класса? Мне нужно описать новый объект класса -- мне нужен класс. Никакой экземпляр класса мне класс не заменит. И для создания нового объекта мне нужен класс -- чтобы не писать в каждом классе изготовитель (не конструктор) копии.
6) Мне трудно говорить за Страуструпа -- я не знаю его, никогда не встречался. Но то, что он мог -- это однозначно. Но не захотел. Я вообще a priori считаю, что авторы языков склонны к весьма серьезно мотивированным решениям, хотя и совершают иногда ошибки. Именно поэтому мне интереснее спросить -- почему в языке так, а не иначе, а не заявлять -- "Так (не)правильно!".