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

Публичное наследование легко.

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

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

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

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

Кто-нибудь может объяснить мне, для чего это, черт возьми? Некоторые говорят, что это «как отношения». Я до сих пор не очень ясно об этом.

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


person user4951    schedule 28.11.2013    source источник
comment
Я могу ошибаться, но мне кажется, что я читал в одной из золотых книг по С++ (не помню точно, в какой именно), что наследование protected (почти?) бессмыслица и (почти?) никогда не используется. . Как зарезервировано для будущего использования. Но, опять же, могу соврать :)   -  person Kiril Kirov    schedule 28.11.2013
comment
этот ответ Йоханнеса Шауба действительно нашел вариант использования. Он по-прежнему называет это редко полезным.   -  person Hulk    schedule 28.11.2013
comment
И частное наследование также почти бесполезно, потому что вместо этого оно должно быть собственностью.   -  person user4951    schedule 28.11.2013
comment
@JimThio За исключением случаев, когда право собственности не работает. (Хорошим примером могут служить примеси.) В более общем смысле частное наследование также является прагматичным решением, когда вы хотите открыть часть (но не весь) интерфейс базового класса; using намного проще, чем функции пересылки.   -  person James Kanze    schedule 28.11.2013
comment
@JimThio: частное наследование является собственностью.   -  person n. 1.8e9-where's-my-share m.    schedule 28.11.2013
comment
Вы можете проверить эту ссылку   -  person benipalj    schedule 28.11.2013


Ответы (2)


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

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

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

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

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

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

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

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

person Arne Mertz    schedule 28.11.2013
comment
Стоит отметить, что первоначальное наследование, скажем, в Smalltalk, больше соответствует частному наследованию, чем общедоступному в C++. Изначально наследование было разработано для поддержки общей реализации, а не не общего интерфейса. - person James Kanze; 28.11.2013
comment
И, конечно же, вы упустили, пожалуй, наиболее распространенную причину частного наследования: базовый класс предоставляет настраиваемую реализацию с использованием шаблона метода шаблона, и вам приходится переопределять его виртуальные функции. - person James Kanze; 28.11.2013
comment
Не говоря уже о том, что иногда тот факт, что вы реализуете конкретный интерфейс, является деталью реализации для ваших клиентов. Тот факт, что виджет GUI является прослушивателем событий GUI, касается только самого виджета (и того, где он регистрируется для событий). - person James Kanze; 28.11.2013
comment
@JamesKanze спасибо за дополнительные баллы. Я боюсь, что в наши дни поддержка разделяемой реализации не рассматривается как хорошая причина для наследования, поскольку люди, как правило, отравлены мышлением «все должно быть чистым объектно-ориентированным». - person Arne Mertz; 28.11.2013
comment
Что касается чистого объектно-ориентированного программирования: как я упоминал выше, в умах изобретателя термина (и одного из авторов Smalltalk) наследование было только наследованием реализации. Первый язык, который использовал метку OO, использовал утиную типизацию, поэтому не было необходимости в наследовании интерфейса. (См. сегодня Python для примера того, как это работает.) - person James Kanze; 28.11.2013
comment
@JamesKanze Я знаю. Существовало и существует множество языков, позволяющих объектно-ориентированное программирование так, как думал об объектно-ориентированном программировании изобретатель этого термина. Однако существует огромное количество программистов, которые думают, что все должно быть объектом, реализовывать какой-то интерфейс и быть частью хотя бы одного шаблона проектирования, свободные функции в C++ — это зло, а такие языки, как Python, на самом деле не являются объектно-ориентированными, потому что они не являются объектно-ориентированными. чистый. Я видел объектно-ориентированные программы на C, но эти фанатики хотят, чтобы все было больше похоже на Java. - person Arne Mertz; 28.11.2013
comment
Я много использовал чистые функции. Они самые гибкие. - person user4951; 28.11.2013
comment
@JimThio я тоже. Но, например, Java даже не позволяет их использовать, вместо этого они должны быть сохранены как статические функции-члены в каком-то классе. Некоторые люди принимают его как стиль программирования для C++, потому что они думают, что это больше объектно-ориентированный подход. - person Arne Mertz; 29.11.2013

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

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

person James Kanze    schedule 28.11.2013
comment
Однажды я использовал защищенную виртуальную базу для управления аргументами командной строки для различных проходов компоновщика; каждый проход обрабатывался своим собственным типом, а тип компоновщика производился частным образом от каждого из типов проходов. Оглядываясь назад, я не уверен, был ли это хороший дизайн или просто хвастовство. - person Pete Becker; 28.11.2013