Наследование — это концепция, используемая в объектно-ориентированной парадигме для написания кода, который удобнее поддерживать и использовать повторно. C ++ имеет различные типы наследования (например, спецификаторы доступа), которые влияют на доступность членов класса.
Эффекты использования разных типов
-
Когда применяется наследование, члены базового класса копируются в производный класс. Спецификаторы доступа этих скопированных членов в производном классе зависят от типа используемого наследования.
-
Тип используемого наследования только влияет на доступность этих скопированных членов при доступе к ним с помощью объекта производного класса.
Следует помнить одно правило: доступность можно только уменьшить (например, с
public
наprotected
) и не увеличивается (например, сprivate
наpublic
).
Ключевые слова, используемые для обозначения различных типов наследования совпадают с ключевыми словами, используемыми для спецификаторов доступа. Синтаксис использования этих ключевых слов объясняется в примерах ниже, где скопированные члены закомментированы в производных классах, чтобы лучше понять концепцию:
1. public
В публичном наследовании все члены базового класса с одинаковой доступностью копируются в производный класс. Это означает, что члены private
и protected
остаются недоступными через объект производного класса.
Публичное наследование — это наиболее распространенный тип наследования. Если тип не указан явно, по умолчанию используется публичное наследование.
Пример
class Base {private: int private_base; protected: int protected_base; public: int public_base;}; class Derived: public Base {private : int private_dehibited; //int private_base; protected: int protected_dehibited; //int protected_base; public: int public_dehibited; //int public_base;}; int main () {//Доступ к «скопированным» членам базового класса с помощью объекта производного класса: Derived d; d.private_base; //Недоступно d.protected_base; //Недоступно d.public_base; //Доступно}
2. protected
public
члены копируются как protected
, в то время как все остальные члены сохраняют свои исходная доступность в защищенном наследовании .
Пример
class Base {private: int private_base; protected: int protected_base; public: int public_base;}; class Derived: protected Base { частный: int private_dehibited; //int private_base; protected: int protected_dehibited; //int protected_base; //int public_base; public: int public_dehibited;}; int main () {//Доступ к «скопированным» членам базового класса с помощью объекта класса Derived1: Derived d; d.private_base; //Недоступно d.protected_base; //Недоступно d.public_base; //Недоступно}
3. private
Частное наследование копирует все члены базового класса в производный класс как private
members.
Пример
class Base {private: int private_base; protected: int protected_base; public: int public_base;}; class Derived: private Base {private: int private_dehibited; //int private_base; //int protected_base; //int public_base; protected: int protected_dehibited; public: int public_dehibited;}; int main () {//Доступ к «скопированным» членам базового класса с помощью объекта класса Derived1: Derived d; d.private_base; //Недоступно d.protected_base; //Недоступно d.public_base; //Недоступно}
Пример
Следующий пример немного сложнее, поскольку он добавляет еще один дочерний класс производного класса:
class Base {private: int private_base; protected: int protected_base; public: int public_base;}; class Derived1: protected Base {private: int private_dehibited1; //int private_base; protected: int protected_dehibited1; //int protected_base; //int public_base; public: int public_dehibited1;}; class Derived2: public Derived1 {private://int private_base; //int private_dehibited1; protected://int protected_base; //int public_base; //int protected_dehibited1; public://int public_dehibited1;}; int main () {//Доступ к «скопированным» членам базового класса с помощью объекта класса Derived1: Derived1 der1; der1.private_base; //Недоступно der1.protected_base; //Недоступен der1. public_base; //Недоступно//Доступ к «скопированным» членам класса Derived1 с помощью объекта класса Derived2: Derived2 der2; der2.private_dehibited1; //Недоступно der2.protected_dehibited1; //Недоступно der2.public_dehibited1; //Доступно}