2010-01-19 4 views
10

Почему защищенное и частное наследование определено и предлагается? Я понимаю, что в некоторых случаях можно использовать частное наследование, но это не рекомендуется. Как насчет защищенного наследования?защищенное наследование

Может ли кто-нибудь предложить мне ситуацию, в которой защищенное наследование является выбором?

Я редко это вижу.

Большое спасибо!

ответ

6

Частное наследование обычно используется для mixins --- где люди наследуют, чтобы получить функциональность из базового класса, а не из-за наследования «is-a».

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

+0

Можете ли вы привести мне пример защищенного Наследование, например, для частного наследования, обычно используется автомобиль, унаследованный от двигателя. – skydoor

+1

+1. Это, я думаю, единственное использование для защищенного наследования. –

+3

Автомобиль 'есть-a' двигатель. Поэтому в идеале должен использоваться «состав», а не «наследование». Как правило, следует использовать наследование, когда отношение 'is-a'. Только мои 2 цента. – CodeRain

5

Обычно я не использую наследование protected. На самом деле, я обычно не использую наследование private. Если что-то не удовлетворяет Принципу замещения Лискова, то я не вижу причины использовать наследование любого рода; и если он удовлетворяет LSP, то вы используете public наследование.

Однако язык различается между private и protected только с точки зрения класса (то есть код с использованием класса не может отличить).

Вы должны использовать protected наследование, когда вы want it's semantics, и вы должны использовать private, когда вы не хотите protected.

+1

Если что-то использует частное наследование, то из POV не-друзей он не наследуется от базы и, следовательно, не удовлетворяет LSP.Частное наследование - это когда наследование представляет собой деталь реализации, а не часть открытого интерфейса. Поэтому, возможно, он мог бы удовлетворить LSP, возможно, нет, но так или иначе вы этого не хотите. –

+0

Ссылка говорит, что доступ запрещен. –

+0

Спасибо за сообщение о ссылке; Я указал ссылку на полуофициальный C++ Super FAQ. –

1

Это ситуация, я бы использовал Protected уделом

Base -> Derived1 -> Derived2

  • Я не хочу Derived1 быть заменен на базовый класс
  • Я хочу, чтобы использовать функциональные возможности базы, а также позволить Derived2 использовать ее без раскрытия функциональность для клиентских классов
+0

Можете ли вы привести несколько примеров? Thks – coelhudo

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