Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 47

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 41 42 43 44 45 46 < 47 > 48 49 50 51 52 53 .. 204 >> Следующая

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) для данного класса. Этот прием описан в гл. 6 "Перегрузка оператора присваивания".
Наследования открытого и закрытого типа
Если класс порожден с использованием спецификатора public class CBlock : public CRectangle {
// определение класса ...
}
то открытые члены базового класса остаются открытыми, а защищенные — защищенными и в производном классе.
Однако если для определения производного класса использован спецификатор private
class CBlock : private CRectangle {
// определение класса ... }
то все закрытые и защищенные члены базового класса становятся закрытыми членами производного класса. Если при определении производного класса спецификатор не задан, то по умолчанию он определяется как закрытый.
Независимо от способа наследования, закрытые члены базового класса недоступны для производного (несмотря на то, что они наследуются производным классом и являются частью любого экземпляра производного класса, прямой доступ к ним из производного класса невозможен).
В языке С++ производные классы почти всегда порождаются открытыми. В частности, во всех примерах мы используем открытые производные классы.
Создание иерархии классов
Производный класс может служить базовым для других производных классов. Таким образом, можно создавать иерархии связанных между собой классов. Например, для создания закругленных блоков (т.е. блоков с закругленными углами), создадим производный от CBlock класс, называющийся CRoundBlock.
class CRoundBlock : public CBlock {
protected:
int Radius; public:
CRoundBlock ()
f
int Radius = 0;
}
CRoundBlock (int L, int T, int R, int B, int Color, int Rad) : CBlock (L, T, R, B, Color) (
SetRadius (Rad); }
void Draw (void) {
// рисует прозрачный прямоугольник с закруглением // используя значение Radius) . . .
// и выполняет заливку прямоугольника заданным цветом: Fill ((Left + Right) / 2, (Top + Bottom) / 2, FillColor); }
void SetRadius (int Rad) {
Radius = max (0, Rad);
}
};
Примечание
Класс CRoundBlock называют прямым (direct) потомком класса CBlock, который по отношению к производному является прямым базовым (direct base) классом, и косвенным (indirect) потомком CRectangle, являющегося для него косвенным базовым (indirect base) классом.
Класс CRoundBlock наследует все члены CBlock, включая наследуемые классом CBlock из CRectangle. В классе CRoundBlock определена дополнительная переменная Radius для хранения радиуса закругления, а также новая версия функции Draw для создания залитых прямоугольников с закругленными углами. Класс CRoundBlock также предоставляет открытую функцию-член SetRadius для установки значения переменной Radius и предоставления конструктора (конструктор по умолчанию, устанавливающий значения всех переменных класса в 0, и конструктор, инициализирующий все переменные указанными значениями).
В следующем фрагменте программы создается экземпляр класса RoundBlock, инициализируются все переменные-члены и рисуется блок с закругленными углами.
CRoundBlock RoundBlock (10, 15, 50, 75, 5, 3); RoundBlock.Draw ();
На рис. 5.1 показана схема иерархии классов, приведенных в примере, а на рис. 5.2 — фигуры, создаваемые с помощью каждого из этих классов.
CRectangle
I члены класса, определенные в CRectangle
CBlock
члены класса, определенные в CRectangle
члены класса, определенные в CBlock
CRaundBlock
1
члены класса, определенные в CBlock
Рис. 5.1. Иерархия приведенных в примере классов
Примечание
Переменная Radius класса CRoundBlock является защищенной, поэтому она доступна из любого класса, производного от CRoundBlock, но не из функций, не принадлежащих иерархии классов.
Такие коммерческие библиотеки классов, как MFC и стандартная библиотека iostream, содержат преимущественно древовидные иерархии родственных классов. В таких иерархиях один класс обычно служит базовым для нескольких производных (что и порождает древовидную структуру). Названные библиотеки классов включены в систему программирования Visual С++. Библиотека MFC рассматривается в третьей части книги.
С Rectangle
CBIock
CRoundBlock
Левый
Верхний
Нижний
Цвет эаливки
радиус
________________J
Правый
Рис. 5.2. Фигуры, нарисованные с помощью приведенных в примере классов
Как и в случае с библиотекой iostream, возможна ситуация, когда один класс является производным более чем от одного класса. Это называется множественным наследованием (multiple inheritance).
Предыдущая << 1 .. 41 42 43 44 45 46 < 47 > 48 49 50 51 52 53 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100