2013-11-28 4 views
10

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

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

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

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

Затем мы защитили наследование.

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

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

+0

Возможно, я ошибаюсь, но я думаю, что я читал в одной из золотых книг на С ++ (не помню, какой именно), что «защищенное» наследование (почти?) Бессмысленно и (почти?) Никогда не использовалось. Как «зарезервировано для будущего использования». Но, опять же, я могу лгать :) –

+0

[этот ответ] (http://stackoverflow.com/a/1374362/2513200) от Johannes Schaub фактически нашел прецедент. Он по-прежнему называет его «редко полезным». – Hulk

+0

Или попробуйте [этот] (http://stackoverflow.com/questions/374399/why-do-we-actually-need-private-or-protected-inheritance-in-c/374423#374423) – neutrino

ответ

10

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

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

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

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

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

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

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

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

+1

Стоит отметить, что исходное наследование, например, Smalltalk, соответствует ближе к частному наследованию, чем к публичному в C++. Наследование первоначально предназначалось для поддержки совместной реализации, _not_ shared interface. –

+4

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

+4

Не говоря уже о том, что иногда тот факт, что вы реализуете определенный интерфейс, является детальностью реализации для ваших клиентов. Тот факт, что виджет GUI является слушателем событий GUI, касается только самого виджета (и где он регистрируется для событий). –

4

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

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

+1

Я когда-то использовал защищенную виртуальную базу для управления аргументами командной строки для различных проходов компоновщика; каждый проход обрабатывался по своему типу, а тип компоновщика был получен частным образом из каждого типа прохода. Оглядываясь назад, я не уверен, был ли это хороший дизайн или просто хвастался. –

Смежные вопросы