Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Наследования открытого и закрытого типа

Доступ к наследуемым переменным

Даже если класс CBlock наследует переменные-члены Left, Top, Right и Bottom из своего базового класса, это не означает возможности прямого доступа, так как они определены в базовом классе как закрытые. Вместо этого пришлось бы использовать открытую функцию GetCoord, как и в остальной части программы. Такое ограничение приводит к тому, что код функций-членов становится в определенной степени неэффективным. В качестве альтернативы можно указать спецификатор доступа protected вместо private (листинг 4.1).

Листинг 4.1

// CRectl.h: файл заголовков класса CRectangle class CRectangle { protected: int Left, int Top; int Right; int Bottom; public: CRectangle () { Left = Top = Right = Bottom = 0; } CRectangle {int L, int T, int R, int B) { SetCoord (L, T, R, B); } void Draw (void); void GetCoord (int *L, int *T, int *R, int *B) { *L = Left; *T = Top; *R = Right; *B = Bottom; } void SetCoord (int L, int T, int R, int B); };

Напомним: в данной версии класса CRectangle предполагается определение методов Draw и SetCoord вне класса. Подобно закрытым членам, к защищенным членам класса доступ извне невозможен. Приведенный ниже способ обращения к переменной является некорректным.

void main () { CRectangle Rect; Rect.Left =10; // ОШИБКА: доступ к защищенному // члену класса невозможен}

Однако в отличие от закрытых к защищенным членам класса можно непосредственно обращаться из класса, производного от того класса, в котором данная переменная определена. Следовательно, CBlock можно переписать, используя прямой доступ к переменным-членам, определенным в CRectangle (листинг 4.2).

Листинг 4.2

// CBlock.h: файл заголовков класса CBlock#include "crectl.h"#include <stdlib.h>void Fill (int X, int Y, int Color);class CBlock: public CRectangle{ protected: int FillColor; public: CBlock() { FillColor = 0; } CBlock (int L, int T, int R, int B, int Color): CRectangle {L, T, R, B) { SetColor (Color); } void Draw (void) { CRectangle::Draw (); Fill ((Left + Right)/2, (Top + Bottom)/2, FillColor); } void SetColor (int Color) { FillColor = _max (0, Color); }};

В данном случае переменную FillColor класса CBlock предпочтительнее определить как защищенную, а не как закрытую. Это обеспечит доступ к ней из любых классов, производных от CBlock, как описано в следующем параграфе.

Можно предоставить другому классу или глобальной функции доступ к внутренним или защищенным членам класса, объявив его или функцию дружественными (friend) для данного класса. Этот прием описан в гл. 5 «Перегрузка оператора присваивания».

Если класс порожден с использованием спецификатора public

class CBlock: public CRectangle{ // определение класса...}

то открытые члены базового класса остаются открытыми, а защищенные – защищенными и в производном классе.

Однако если для определения производного класса использован спецификатор private

class CBlock: private CRectangle{ // определение класса...}

то все закрытые и защищенные члены базового класса становятся закрытыми членами производного класса. Если при определении производного класса спецификатор не задан, то по умолчанию он определяется как закрытый.

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

В языке C++ производные классы почти всегда порождаются открытыми. В частности, во всех примерах мы используем открытые производные классы.

<== предыдущая лекция | следующая лекция ==>
Порядок вызова конструкторов и деструкторов | Преимущества наследования
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 365; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.