Основы программирования

Новые типы С++ - Видимость
Индекс материала
Новые типы С++
Классы и Члены
Классы
Инициализация
Очистка
Интерфейсы и Реализации
Законченный Класс
Друзья и Объединения
Вложенные Классы
Структуры и Объединения
Конструкторы и Деструкторы
Предостережение
Свободная Память
Вектора Объектов Класса
Небольшие Объекты
Предостережение
Упражнения
Перегрузка Операций
Функции Операции
Предопределенный Смысл Операций
Конструкторы
Константы
Присваивание и Инициализация
Индексирование
Вызов Функции
Класс String
Синтаксис вызова функции
Предостережение
Упражнения
Производные Классы
Производные Классы
Функции
Видимость
Указатели
Иерархия Типов
Конструкторы и Деструкторы
Поля Типа
Виртуальные Функции
Альтернативные Интерфейсы
Реализация
Как Этим Пользоваться
Обработка Ошибок
Обобщенные Классы
Ограниченные Интерфейсы
Добавление к Классу
Неоднородные Списки
Администратор Экрана
Библиотека Фигур
Прикладная Программа
Свободная Память
Упражнения
Все страницы

7.2.3 Видимость

Класс employee стал открытым (public) базовым классом класса manager в результате описания:

class manager : public employee (* // ... *);

Это означает, что открытый член класса employee является также и открытым членом класса manager. Например:

void clear(manager* p) (* p-»next = 0; *)

будет компилироваться, так как next – открытый член и employee и manager'а. Альтернатива – можно определить закртый (private) класс, просто опустив в описании класса слово public:


class manager : employee (* // ... *);

Это означает, что открытый член класса employee является закрытым членом класса manager. То есть, функции члены класса manager могут как и раньше использовать открытые члены класса employee, но для пользователей класса manager эти члены ндоступны. В частности, при таком описании класса manager функция clear() компилироваться не будет. Друзья производного класса имеют к членам базового класса такой же доступ, как и функции члены.

Поскольку, как оказывается, описание открытых базовых классов встречается чаще описания закрытых, жалко, что описние открытого базового класса длиннее описания закрытого. Это, кроме того, служит источником запутывающих ошибок у нчинающих.

Когда описывается производная struct, ее базовый класс по умолчанию является public базовым классом. То есть,

struct D : B (* ...

означает

class D : public B (* public: ...

Отсюда следует, что если вы не сочли полезным то сокртие данных, которое дают class, public и friend, вы можете просто не использовать эти ключевые слова и придерживаться struct. Такие средства языка, как функции члены, конструкторы и перегрузка операций, не зависят от механизма сокрытия даных.

Можно также объявить некоторые, но не все, открытые члны базового класса открытыми членами производного класса. Например:

class manager : employee (* // ... public: // ... employee::name; employee::department; *);

Запись

имя_класса :: имя_члена ;

не вводит новый член, а просто делает открытый член бзового класса открытым для производного класса. Теперь name и department могут использоваться для manager'а, а salary и age – нет. Естественно, сделать закрытый член базового класса окрытым членом производного класса невозможно. Невозможно с помощью этой записи также сделать открытыми перегруженные имена.

Подытоживая, можно сказать, что вместе с предоставлением средств дополнительно к имеющимся в базовом классе, произвоный класс можно использовать для того, чтобы сделать средства (имена) недоступными для пользователя. Другими словами, с пмощью производного класса можно обеспечивать прозрачный, плупрозрачный и непрозрачный доступ к его базовому классу.