Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.pdf
Скачиваний:
121
Добавлен:
28.03.2015
Размер:
1.58 Mб
Скачать

Основы объектно-ориентированного программирования в примерах на С++

p = &t;

cout << "Площадь треугольника = " << p->get_area() << endl; return 0;

}

Результат работы программы:

Площадь прямоугольника = 4.08 Площадь треугольника = 2.04

Иерархии классов и абстрактные классы

Абстрактный класс является интерфейсом, иерархия классов – средством последовательного построения классов. Интерфейс и строительные блоки – вот главные роли абстрактных классов и иерархии классов.

Классическая иерархия (или традиционная иерархия классов, существующая в языках Simula, Smalltalk и ранних программах на С++) – это иерархия, в которой отдельные классы предоставляют пользователям полезные функции и одновременно являются строительными блоками для реализации более мощных или специализированных классов. Такие иерархии классов идеальны для поддержки программирования методом последовательных усовершенствований. Они предоставляют максимум поддержки для реализации новых классов, в то время как новые классы в значительной степени используют существующую иерархию.

Классические иерархии имеют тенденцию смешивать вопросы реализации с интерфейсами для пользователей. В этих случаях на помощь приходят абстрактные классы. Иерархии абстрактных классов предоставляют ясный и мощный способ выражения концепций, не загроможденных вопросами реализации, и при этом не приводят к значительным накладным расходам, так как вызов чисто виртуальной функции не дороже вызова любой другой виртуальной функции.

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

Применение динамического полиморфизма

Осознавая важность механизма виртуальных функций, обсудим теперь преимущества и недостатки использования раннего и позднего связывания.

Функции раннего связывания – это обычные функции, перегруженные функции, невиртуальные компонентные функции и функции-друзья. Главное преимущество раннего связывания (и довод в пользу его широкого использования) – обеспечение высокого быстродействия программ. Главный недостаток – потеря гибкости.

142