Ответ 1
Частное наследование также легко, но бессмысленно
A: private B означает, что A реализуется B. Однако это бессмысленно, потому что это означает, что A должен содержать B вместо этого. Владение означает меньшее сцепление без каких-либо недостатков.
Чтобы вы не видели причин для частного наследования, это не значит, что это бессмысленно. Есть несколько случаев, когда у частного наследства есть причины. Вы правы в том, что на первый взгляд, у частного наследования есть отношения, подобные агрегации, и что частное наследование имеет (слегка) более тугую связь.
Причины благоприятствования частному наследованию по сравнению с aggretation могут быть следующими:
- С частным наследованием вы также наследуете typedefs. В некоторых случаях (например, классы признаков), наследующие приватно, это просто альтернатива повторной типепептидам тон typedefs в базовом классе.
- В редких случаях вам нужно инициализировать элемент до "реального" (т.е. общедоступного) базового класса. Единственный способ добиться этого - сделать этот член частным базовым классом, унаследованным перед публичной базой.
- Несколько раз вам нужен доступ к защищенным членам участника. Если вы не можете изменить сам класс-член, вы должны использовать личное наследование для доступа к ним.
- Если член не имеет собственных данных, он по-прежнему занимает пространство. Создание его частного базового класса позволяет оптимизировать пустой базовый класс, уменьшая размер объектов вашего класса.
- для еще большего количества баллов, см. комментарии Джеймса ниже
Эти причины, очевидно, являются техническими причинами, некоторые могут даже сказать "хаки". Однако такие причины существуют, поэтому частное наследование не является совершенно бессмысленным. Это просто не "чистый стиль OO", но С++ также не является чистым языком OO.
Причина защищенного наследования довольно проста, как только вы поняли, что для частного наследования:
Если у вас есть причины наследовать что-то частным образом и вы хотите, чтобы эти преимущества (то есть потенциальный член вашего класса или typedefs) были доступны для производных классов, используйте защищенное наследование. Очевидно, что частное наследование должно использоваться едва ли и защищенное наследование еще более.