Каково практическое использование защищенного наследования?

Наше публичное наследование легко.

A: public B означает, что каждый A является B. В большинстве языков программирования, таких как vb.net и objective-c, это единственный тип наследования.

Частное наследование также легко, но бессмысленно

A: private B означает, что A реализуется B. Однако это бессмысленно, потому что это означает, что A должен содержать B вместо этого. Владение означает меньшее сцепление без каких-либо недостатков.

Тогда у нас есть защищенное наследование.

Может кто-нибудь объяснить мне, для чего это черт? Некоторые говорят, что это "как отношения". Я все еще не очень понимаю.

Есть ли у кого-нибудь примерные случаи, когда люди используют защищенное наследование в хорошем шаблоне (и совести) для фактического продуктивного использования?

Ответ 1

Частное наследование также легко, но бессмысленно

A: private B означает, что A реализуется B. Однако это бессмысленно, потому что это означает, что A должен содержать B вместо этого. Владение означает меньшее сцепление без каких-либо недостатков.

Чтобы вы не видели причин для частного наследования, это не значит, что это бессмысленно. Есть несколько случаев, когда у частного наследства есть причины. Вы правы в том, что на первый взгляд, у частного наследования есть отношения, подобные агрегации, и что частное наследование имеет (слегка) более тугую связь.

Причины благоприятствования частному наследованию по сравнению с aggretation могут быть следующими:

  • С частным наследованием вы также наследуете typedefs. В некоторых случаях (например, классы признаков), наследующие приватно, это просто альтернатива повторной типепептидам тон typedefs в базовом классе.
  • В редких случаях вам нужно инициализировать элемент до "реального" (т.е. общедоступного) базового класса. Единственный способ добиться этого - сделать этот член частным базовым классом, унаследованным перед публичной базой.
  • Несколько раз вам нужен доступ к защищенным членам участника. Если вы не можете изменить сам класс-член, вы должны использовать личное наследование для доступа к ним.
  • Если член не имеет собственных данных, он по-прежнему занимает пространство. Создание его частного базового класса позволяет оптимизировать пустой базовый класс, уменьшая размер объектов вашего класса.
  • для еще большего количества баллов, см. комментарии Джеймса ниже

Эти причины, очевидно, являются техническими причинами, некоторые могут даже сказать "хаки". Однако такие причины существуют, поэтому частное наследование не является совершенно бессмысленным. Это просто не "чистый стиль OO", но С++ также не является чистым языком OO.

Причина защищенного наследования довольно проста, как только вы поняли, что для частного наследования:

Если у вас есть причины наследовать что-то частным образом и вы хотите, чтобы эти преимущества (то есть потенциальный член вашего класса или typedefs) были доступны для производных классов, используйте защищенное наследование. Очевидно, что частное наследование должно использоваться едва ли и защищенное наследование еще более.

Ответ 2

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

Кроме того, частное наследование вовсе не бессмысленно, а на самом деле, соответствует первоначальному использованию наследования. Как только базовый класс, выполняющий реализацию, использует виртуальные функции, которые производный класс должен перегружаться, сдерживание не может быть использовано.