Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++ глава 4.doc
Скачиваний:
4
Добавлен:
05.11.2018
Размер:
131.07 Кб
Скачать

4.4. Создание иерархии классов

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

class CRoundBlock : public CBlock

{

protected:

int Radius;

public:

CRoundBlock ()

{

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 ();

На рис. 4.1 показана схема иерархии классов, приведенных в примере, а на рис. 4.2 – фигуры, создаваемые с помощью каждого из этих классов.

Рис. 4.1. Иерархия приведенных в примере классов

Примечание

Переменная Radius класса CRoundBlock является защищенной, поэтому она доступна из любого класса, производного от CRoundBlock, но не из функций, не принадлежащих иерархии классов.

Такие коммерческие библиотеки классов, как MFC и стандартная библиотека iostream, содержат преимущественно древовидные иерархии родственных классов. В таких иерархиях один класс обычно служит базовым для нескольких производных (что и порождает древовидную структуру). Названные библиотеки классов включены в систему программирования Visual C++.

Рис. 5.2. Фигуры, нарисованные с помощью приведенных в примере классов

Как и в случае с библиотекой iostream, возможна ситуация, когда один класс является производным более чем от одного класса. Это называется множественным наследованием (multiple inheritance).

Преимущества наследования

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

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

В языке C++ с помощью иерархии классов можно воссоздать модель взаимоотношений реального мира. Например, при создании класса CBlock, производного от Crectangle, отражается тот факт, что блок является прямоугольником определенного типа (прямоугольником, внутренняя область которого залита цветом), а создание класса CRoundBlock, производного от CBlock, соответствует тому, что закругленный блок является блоком определенного типа. В качестве другого примера приведем MFC, иерархия классов которой тщательно моделирует взаимосвязи между различными элементами Windows.