Применение модификаторов доступа private, protected, public при наследовании классов
Перед изучением данной темы рекомендуется ознакомиться со следующей темой:
Содержание
- 1. Особенности применения модификаторов доступа при наследовании классов
- 2. Модификатор доступа private для базового класса.
- 3. Модификатор доступа protected
- 4. Модификатор доступа 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).
Рисунок 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).
Рисунок 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).
Рисунок 3. Модификатор protected для класса. Элементы базового класса, объявленные как protected или public, есть доступны из методов унаследованного класса
Рисунок 4. Модификатор доступа protected для класса. Нет доступа к членам базового класса A из экземпляров любых унаследованных классов (B, C, D и т.д.)
Как видно из рисунка 4, члены класса A являются закрытыми для экземпляров производных классов B и C.
⇑
4. Модификатор доступа public
Если в имени базового класса используется модификатор доступа public, то действуют следующие правила:
- protected и public-члены базового класса доступны из методов унаследованного класса;
- private-члены базового класса недоступны из методов унаследованного класса;
- public-члены базового класса доступны из экземпляров унаследованного класса;
- private и protected члены базового класса недоступны из экземпляров унаследованного класса.
Рисунок 5 демонстрирует вышеуказанные правила.
Рисунок 5. Модификатор доступа public для унаследованного класса
⇑
Связанные темы
⇑