Какие существуют типы наследования в C ++?

Наследование — это концепция, используемая в объектно-ориентированной парадигме для написания кода, который удобнее поддерживать и использовать повторно. C ++ имеет различные типы наследования (например, спецификаторы доступа), которые влияют на доступность членов класса.

Эффекты использования разных типов

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

  2. Тип используемого наследования только влияет на доступность этих скопированных членов при доступе к ним с помощью объекта производного класса.

Следует помнить одно правило: доступность можно только уменьшить (например, с 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; //Доступно} 

Оцените статью
nanomode.ru
Добавить комментарий