|
Программирование >> Программирование на языке c++
Рассмотрим пример: class BASE { int private member; private no умолчанию protected: int protected member; public: int public member; void base function(void); class DERIVED : public BASE { void derived function(void); }; void global function(BASE* pointer to base) pointer to base->private member = 0; ошибка pointer to base->protected member = 5; ошибка pointer to base->public member = 10; нет ошибки void BASE::base function(void) private member = 0; нет ошибки protected member = 5; нет ошибки public member = 10; нет ошибки void DERIVED::derived function(void) private member = 0; ошибка protected member = 5; нет ошибки public member = 10; нет ошибки Подобно компонентам класса базовый класс целиком может быть объявлен с атрибутами private (локальный), protected (защищенный) и public (глобальный). Рассмотрим пример: class BASE { public: int base public variable; .................... }; class DERIVED PUBLIC : public BASE { }; class DERIVED PROTECTED : protected BASE { }; class DERIVED PRIVATE : private BASE { }; Поскольку BASE является глобальным базовым классом для класса DERIVED PUBLIC, то указатель на базовый класс можно использовать так же, как указатель на производный класс и осуществлять через указатель на производный класс доступ к глобальным (public) компонентам базового класса. Действительно, если базовый класс имеет атрибут public, то он полностью доступен как класс для производного класса. Доступ же к компонентам базового класса осуществляется в соответствии с атрибутами этих компонентов. Рассмотрим пример: void global function(DERIVED PUBLIC* dpublic) { BASE* pointer to base = dpublic; нет ошибки dpublic -> base public variable = 100; нет ошибки Если базовый класс имеет атрибут protected или private, то указатель на базовый класс нельзя использовать как указатель на производный класс (этот указатель на базовый класс является либо защищенным - protected, либо недоступным - private). Если компоненты базового класса имеют атрибут public, то эти же компоненты будут иметь атрибут protected или private в производном классе. В целом атрибут базового класса устанавливает правила доступа так же, как и атрибут компонента класса, а именно: > если атрибут компонента класса (базового класса) public, то доступ к компоненту класса (базовому классу) может осуществляться из-за пределов класса (из-за пределов производного класса). Дополнительно правила доступа к компонентам базового класса определяются атрибутами этих компонентов; > если атрибут компонента класса (базового класса) protected, то доступ к компоненту класса (базовому классу) может осуществляться из компонентов и friend функций класса (из компонентов и friend функций производного класса для нашего базового класса) и компонентов и friend функций производного класса (из компонентов и friend функций класса, являющегося производным от нашего производного класса); > если атрибут компонента класса (базового класса) private, то доступ к компоненту класса (базовому классу) может осуществляться только из компонентов и friend функций класса (из компонентов и friend функций производного класса для нашего базового класса). Когда мы объявляем указатель на базовый класс: BASE* pointer to base; то он, в зависимости от атрибута базового класса, будет либо public, либо protected, либо private. Компоненты базового класса имеют определенные атрибуты (private, protected или public). Производный класс наследует атрибуты компонентов базового класса следующим образом: если базовый класс имеет атрибут public, то компоненты public и protected базового класса будут компонентами public и protected в производном классе. Компоненты private базового класса остаются компонентами private базового класса (к ним нельзя получить доступ из-за пределов базового класса); если базовый класс имеет атрибут protected, то компоненты public и protected базового класса становятся компонентами protected производного класса. Компоненты private базового класса остаются компонентами private базового класса; > если базовый класс имеет атрибут private, то компоненты public и protected базового класса становятся компонентами private производного класса. Компоненты private базового класса остаются компонентами private базового класса. Фактически атрибут базового класса определяет верхнюю допустимую границу для атрибутов компонентов этого базового класса, к которым осуществляется доступ через производный класс (рис. 4.6). Использование атрибута public для базового класса не изменяет правила доступа к компонентам базового класса через производный класс (через имя, указатель или ссылку на объект производного класса). Использование атрибутов protected и private для базового класса ужесточает правила доступа к компонентам базового класса через производный класс. Приведенный ниже пример демонстрирует различные правила доступа к компонентам классов. Этот пример и рис. 4.5, 4.6 хорошо дополняют друг друга.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |