Язык программирования C/С++
01.10
Когда, зачем и для чего использовать частное наследование?
“В случае защищённого доступа вы завоняете, что Roadster всё ещё имеет доступ к Vehicle, и это верно. Но вы не можете создать Roadster как Vehicle, когда используете непубличное наследование. Эта строка не скомпилируется!!!»
*картинка о public, но поймете
Когда нужно использовать частное наследование?
- Производный класс должен вызывать (невиртуальные) функции базового класса
- Базовый класс должен вызывать (обычно чисто виртуальные) функции производного класса
Сначала разберём, что же такое частное наследование.
- Спецификатор доступа наследования не влияет на наследование реализации. Реализация всегда наследуется на основе уровня доступа функций. Спецификатор доступа наследования влияет только на доступность интерфейса класса.
Это означает, что все публичные и защищённые переменные и функции будут доступны в производном классе, даже при использовании частного наследования! С другой стороны, эти публичные (public) и защищённые (protected) элементы базового класса не будут доступны извне через производный класс.
Когда полезно и в чём же суть?
Вы, вероятно, знаете что наследование служит для выражения отношений "является" (is-a).
-
Если класс Car наследуется от Vehicle, мы можем сказать, что Car является Vehicle.
-
Далее, класс Roadster наследуется от Car, он всё ещё Vehicle, имея доступ ко всем членам (функциям) Vehicle.
Но что, если наследование между Vehicle и Car было частным?
Тогда этот Roadster не будет иметь доступа к интерфейсу Vehicle, даже если он публично наследуется от Car.
Мы просто не можем больше называть это отношением "является". Это отношение "имеет" (has-a).
Производные классы, в данном конкретном примере Car, будут иметь доступ к базовому классу (Vehicle) и будут отображать его на основе уровня доступа: защищённый или частный. Частный означает - что он не отображается. Он служит как частный член.
В случае защищённого доступа вы завоняете, что Roadster всё ещё имеет доступ к Vehicle, и это верно. Но вы не можете создать Roadster как Vehicle, когда используете непубличное наследование. Эта строка не скомпилируется!!!
cppVehicle* p = new Roadster();
Если мы хотим сохранить аналогию с автомобилями, можно сказать, что Car может частно наследоваться от гипотетического класса Engine, при этом он всё ещё публично наследуется от Vehicle.
Но даже если вы не намерены вводить иерархию наследования, частное наследование, не интуитивно и настолько отличается от большинства других языков, что его просто неудобно использовать.
#новости #айти #itsphere #урок #программированиееще контент в этом сообществе
еще контент в этом соообществе
Язык программирования C/С++
01.10
войдите, чтобы увидеть
и подписаться на интересных профи