- Основы ООП: абстракция
- Основы ООП: инкапусляция
- Основы ООП: наследование
- Основы ООП: полиморфизм
- Основы ООП: композиция (дизайн)
- Определение класса
- Права доступа
- Конструкторы: по умолчанию, параметрический, копирования
- Деструкторы
- Ссылка на себя: this
- Наследование
- Динамическое создание объектов: new и delete
- Указатели
- Виртуальные методы (virtual и override)
- Статические члены
- Вложенные типы, пространства имен и оператор контекста '::'
- Разнесение объявления и определения класса
- Абстрактные классы и интерфейсы
- Перегрузка операторов
- Приведение объектных типов: dynamic_cast и указатель void *
- Указатели, ссылки и const
- Управление наследованием: final и delete
Основы ООП: полиморфизм
Термин полиморфизм означает изменчивость, многоликость. Это обратная сторона абстракции, совмещенной с механизмом наследования. Когда мы имеем некий общий программный интерфейс, его могут реализовать разные классы, связанные отношениями наследования. Тогда вызов методов интерфейса приведет к выполнению задачи разными способами.
Например, представим себе семейство абстрактных средств передвижения, включающее пару конкретных: машину и вертолет. Команда переместиться из точки А в точку Б будет выполнена ими одинаково успешно, но машина проделает путь по земле, а вертолет — по воздуху.
Для большей наглядности продолжим пример с программой рисования. Можно сказать, что многоликость в неё заложена на уровне графических фигур. Пользователь волен нарисовать произвольное сочетание кругов, квадратов и треугольников. Каждый из этих объектов должен уметь отображать себя на экране по своим координатам и используя свой стиль, но самое главное — делать это в виде соответствующей формы.
В программе наверняка будет массив (или другой контейнер), хранящий все созданные пользователем фигуры, и вывод на экран рисунка целиком должен заключаться в последовательном рисовании каждой фигуры. Если мы сведем инструкции рисования для фигур в отдельный метод (пусть он так и называется draw), то для каждого класса получится своя реализация. Однако заголовок этих функций будет полностью идентичен, поскольку они выполняют одну и ту же задачу, и берут исходные данные из объектов.
Следовательно, мы получили возможность унифицировать исходный код, поскольку один и тот же вызов draw внутри цикла по фигурам проявляет полиморфизм: отображаемая форма будет зависеть от типа объекта.