Студопедия

КАТЕГОРИИ:


Архитектура-(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 класс, называющийся 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.

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


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


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



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




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