- •Предисловие
- •Введение
- •Парадигмы программирования и С++
- •Объектно-ориентированное программирование и С++
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Структуры и объединения – абстрактные типы данных
- •Структуры
- •Объединения
- •Класс – абстрактный тип данных
- •Класс как расширение понятия структуры
- •Конструкторы, деструкторы и доступ к компонентам класса
- •Компонентные данные и компонентные функции
- •Статические компоненты класса
- •Указатели на компоненты класса
- •Определение компонентных функций
- •Указатель this
- •Друзья класса
- •Перегрузка стандартных операторов
- •Бинарные и унарные операторы
- •Смешанная арифметика
- •Вывод
- •Копирующее присваивание
- •Вызов функции
- •Индексация
- •“Умные указатели”
- •Наследование классов
- •Множественное наследование и виртуальные базовые классы
- •Виртуальные функции
- •Абстрактные классы
- •Иерархии классов и абстрактные классы
- •Применение динамического полиморфизма
- •Вложенные и локальные классы
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •СОДЕРЖАНИЕ
Основы объектно-ориентированного программирования в примерах на С++
p = &t;
cout << "Площадь треугольника = " << p->get_area() << endl; return 0;
}
Результат работы программы:
Площадь прямоугольника = 4.08 Площадь треугольника = 2.04
Иерархии классов и абстрактные классы
Абстрактный класс является интерфейсом, иерархия классов – средством последовательного построения классов. Интерфейс и строительные блоки – вот главные роли абстрактных классов и иерархии классов.
Классическая иерархия (или традиционная иерархия классов, существующая в языках Simula, Smalltalk и ранних программах на С++) – это иерархия, в которой отдельные классы предоставляют пользователям полезные функции и одновременно являются строительными блоками для реализации более мощных или специализированных классов. Такие иерархии классов идеальны для поддержки программирования методом последовательных усовершенствований. Они предоставляют максимум поддержки для реализации новых классов, в то время как новые классы в значительной степени используют существующую иерархию.
Классические иерархии имеют тенденцию смешивать вопросы реализации с интерфейсами для пользователей. В этих случаях на помощь приходят абстрактные классы. Иерархии абстрактных классов предоставляют ясный и мощный способ выражения концепций, не загроможденных вопросами реализации, и при этом не приводят к значительным накладным расходам, так как вызов чисто виртуальной функции не дороже вызова любой другой виртуальной функции.
Проектирование на основе абстрактных классов почти настолько же просто, как эквивалентный метод с использованием общего базового класса. Однако у первого подхода есть неоспоримое преимущество – пользователи иерархии абстрактных классов меньше рискуют попасть в зависимость от способа реализации общих понятий, чем пользователи классической иерархии. Пользователи абстрактного класса не могут случайно воспользоваться механизмами реализации, потому что им доступны только те средства, которые явно указаны в иерархии этого абстрактного класса, и ничто не наследуется неявно из зависящего от реализации базового класса.
Применение динамического полиморфизма
Осознавая важность механизма виртуальных функций, обсудим теперь преимущества и недостатки использования раннего и позднего связывания.
Функции раннего связывания – это обычные функции, перегруженные функции, невиртуальные компонентные функции и функции-друзья. Главное преимущество раннего связывания (и довод в пользу его широкого использования) – обеспечение высокого быстродействия программ. Главный недостаток – потеря гибкости.
142