ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн

Спецификатор доступа protected

Мы научились расширять возможности класса почти без модификации его кода. Рассмотрим, что же мы все-таки изменили в классе Counter.

Данные классов, с которыми мы ранее познакомились, включая переменную counter класса Counter из примера COUNTPP3, имели спецификатор доступа private. В программе COUNTEN переменная counter имеет другой спецификатор доступа: protected. Рассмотрим его предназначение.

Вспомним, что нам известно о спецификаторах доступа private и public. Из методов класса есть доступ к членам (полям и методам) класса, если они имеют любой из этих спецификаторов. Но при использовании объекта, объявленного в программе, можно получить доступ только к данным со спецификатором public (например, используя операцию точки). Предположим, что есть объект objA класса A. Метод funcA() является методом класса A. Оператор функции main() (или любой другой функции, не являющейся методом класса A)

objA.funcA ( );

будет ошибочным, пока мы не объявим funcA() как public. Для объекта objA мы не можем использовать члены класса A, объявленные как private. Их могут исполь- зовать только методы самого класса A. Это показано на рис. 9.3.

Одцако при использовании наследования у нас появляется еще ряд добавоч- ных возможностей. Возникает вопрос, могут ли методы производного класса иметь доступ к членам базового класса? Другими словами, может ли operator--() класса CountDn иметь доступ к полю count класса Counter? Ответ будет таким: методы производного класса имеют доступ к членам базового класса, если они имеют спецификатор доступа public или protected. К членам, объявленным как private, доступа нет.

Мы не хотим объявлять поле count как public, так как это разрешит доступ к ней из любой функции программы, уничтожив возможность сокрытия данных. Член, объявленный как protected, доступен методам своего класса и методам любо-

Рис. 9.4. Спецификаторы доступа в ситуации с наследованием

Таблица 9.1 отражает возможности использования спецификаторов доступа в различных ситуациях.

Таблица 9.1. Наследование и доступ

го производного класса. При этом он не будет доступным из функций, не принад- лежащих к этим классам, например из функции main(). Это показано на рис. 9.4.

class A

Рис. 9.3. Спецификаторы доступа в ситуации без наследования

class Base

Специфиикатор доступа

Доступ из самого класса

Доступ из производных  классов

Доступ из  внешних классов и  функций

public

Есть

Есть

Есть

protected

Есть

Есть

Нет

private

Есть

Нет

Нет

Таким образом, если вы пишете класс, который впоследствии будет использо- ваться как базовый класс при наследовании, то данные, к которым нужно будет иметь доступ, следует объявлять как protected.

 

8