C++. Применение модификаторов доступа private, protected, public при наследовании классов




Применение модификаторов доступа private, protected, public при наследовании классов

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Поиск на других ресурсах:

1. Особенности применения модификаторов доступа при наследовании классов

В языке C++ модификаторы доступа private, protected, public могут применяться к базовым классам при их наследовании производными классами. Действие того или иного модификатора влияет на уровень доступности элементов базовых классов и проявляется в двух случаях:

  • когда классы образуют иерархию наследования;
  • когда создаются экземпляры унаследованных классов.

Общая форма задания уровня доступа к базовому класса следующая:

class DerivedClass : [access_modifier] BaseClass
{

};

здесь

  • BaseClass – базовый класс;
  • DerivedClass – производный класс;
  • access_modifier – один из модификаторов доступа private, protected, public.

Модификатор доступа может отсутствовать, в этом случае по умолчанию принимается private-доступ.

 

2. Модификатор доступа private для базового класса.
2.1. Ограничение доступа для унаследованных классов

Если класс B является производным от базового класса A и базовый класс A содержит модификатор доступа private, то действуют следующие правила видимости:

  • все private-элементы класса A недоступны в классе B;
  • все protected-элементы класса A видимы в классе B;
  • все public-элементы класса A видимы в классе B;
  • все классы, унаследованные от класса B, не будут иметь доступ к элементам класса A (рисунок 1).

 

C++. Модификатор доступа private для класса. Ограничение доступа для класса в иерархии классов

Рисунок 1. Модификатор доступа private для класса. Ограничение доступа для класса C в иерархии классов

Как видно из рисунка 1 из класса B можно доступиться к protected и public элементам класса A. Однако, для класса C класс A есть полностью закрытым (ограничение модификатора private). Если из класса C будут унаследованы другие классы (D, E и т.д.), то класс A для этих классов также будет закрытым.

 

2.2. Ограничения доступа для экземпляров (объектов) унаследованных классов

Если классы A, B образуют иерархию наследования и класс A является базовым для класса B, то действуют следующие правила относительно экземпляров этих классов:

  • из экземпляра класса A доступны только public-элементы (члены данных, методы);
  • из экземпляра класса B не есть доступными любые элементы класса A. Здесь срабатывает ограничение модификатора private перед именем класса A (рисунок 2).

 

C++. Модификатор доступа private для класса. Нет доступа к элементу базового класса из экземпляра производного класса

Рисунок 2. Модификатор доступа private для класса. Нет доступа к элементу базового класса A из экземпляра производного класса B

Как видно из рисунка 2, любые элементы private-базового класса A являются закрытыми для экземпляров унаследованного класса B.

 

3. Модификатор доступа protected

Модификатор доступа protected ограничивает доступ из экземпляров унаследованных классов и не ограничивает доступ из методов унаследованных классов. Если два класса A, B образуют иерархию наследования, и класс A объявлен базовым с модификатором protected, то действуют следующие правила:

  • все protected— и public-элементы класса A доступны из методов класса B (рисунок 3);
  • все protected— и public-элементы класса A доступны из методов класса, унаследованного от класса B (класса C)
  • нет доступа к любому элементу класса A из экземпляров производных классов (рисунок 4).

 

C++. Модификатор protected для класса. Элементы базового класса, объявленные как protected или public, есть доступны из методов унаследованного класса

Рисунок 3. Модификатор protected для класса. Элементы базового класса, объявленные как protected или public, есть доступны из методов унаследованного класса

 

C++. Модификатор доступа protected для класса. Нет доступа к членам базового класса из экземпляров любых унаследованных классов

Рисунок 4. Модификатор доступа protected для класса. Нет доступа к членам базового класса A из экземпляров любых унаследованных классов (B, C, D и т.д.)

Как видно из рисунка 4, члены класса A являются закрытыми для экземпляров производных классов B и C.

 

4. Модификатор доступа public

Если в имени базового класса используется модификатор доступа public, то действуют следующие правила:

  • protected и public-члены базового класса доступны из методов унаследованного класса;
  • private-члены базового класса недоступны из методов унаследованного класса;
  • public-члены базового класса доступны из экземпляров унаследованного класса;
  • private и protected члены базового класса недоступны из экземпляров унаследованного класса.

Рисунок 5 демонстрирует вышеуказанные правила.

 

C++. Модификатор доступа public для унаследованного класса

Рисунок 5. Модификатор доступа public для унаследованного класса

 


Связанные темы