ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
Схожі підручники
- СЛОВНИК ОСНОВНИХ ЕКОЛОГІЧНИХ ТЕРМІНІВ ТА ПОНЯТЬ
- РЕГІОНАЛЬНА ЕКОНОМІКА (частина 3)
- ЦЕНТРАЛЬНІ БАНКИ В СИСТЕМІ МОНЕТАРНОГО ТА БАНКІВСЬКОГО УПРАВЛІННЯ
- Методичні вказівки до виконання практичного заняття на тему «Теорія ігор.»
- ПСИХОЛОГО-ПЕДАГОГІЧНІ ОСНОВИ МІЖОСОБИСТІСНОГО СПІЛКУВАННЯ НАВЧАЛЬНИЙ ПОСІБНИК (онлайн)
- Цивільна оборона (частина 1)