- •1. Объектно-ориентированный подход в программировании.
- •1.1 Инкапсуляция
- •1.2 Наследование
- •1.3 Полиморфизм
- •2.1 Перегружаемые (overload) функции
- •2.2 Перегружаемые (overload) операторы
- •2.3 Объектные типы данных: структуры, объединения, классы (обзор)
- •2.4. Конструкторы и деструкторы
- •2.8 Встраиваемые функции
- •2.7 Производные классы
- •2.9 Присваивание объектов
- •2.10 Передача в функции и возвращение объекта
- •2.11 Конструктор копирования
- •2.12 Указатели и ссылки на объекты
- •3.1. Модификаторы наследования
- •3.2 Конструкторы при наследовании
- •3.3 Деструкторы при наследовании
- •3.4 Совместимость типов
- •4. Виртуальные функции.
- •4.1. Раннее и позднее связывание
- •4.2 Полиморфизм и виртуальные методы
- •4.3. Использование указателей на базовые классы при адресации объектов произвольных классов.
- •4.4 Абстрактный класс
- •5. Дружественные функции.
- •5.1 “Дружественные” (friend) функции
- •6. Шаблоны функций и классов
- •6.1 Шаблоны функций
- •6.2 Шаблоны классов
1.3 Полиморфизм
Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования. Он означает взаимозаменяемость объектов с одинаковым интерфейсом и позволяет одно и тоже имя использовать для решения нескольких технически разных задач.
Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами — из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции .
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Это означает, что общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Таким образом создается общий интерфейс для группы близких по смыслу действий. Общность имеет внешнее и внутреннее выражение. Внешне общность проявляется как одинаковый набор методов с одинаковыми именами и типами аргументов и результатов. Внутренняя общность есть одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного интерфейса для единого класса действий. Выбор конкретного действия в зависимости от ситуации возлагается на компилятор.
Полиморфизм в языке С++ применим к функциям и операциям (имеются в виду операции типа +, =, [ ] и др.).
Таким образом , полиморфизм означает присваивание действию одного имени или обозначения, которое совместно используется объектами различных типов, при этом каждый объект реализует действие способом, соответствующим его типу.
2. Объектно-ориентированные средства С++
2.1 Перегружаемые (overload) функции
Одна из ключевых черт полиморфизма в C++ - замещение или перегрузка функций.
Транслятор языка C++ различает функции не только по именам, но и по типам входных параметров (но не по типам возвращаемого значения). Перегрузка функций — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов функции, имеющей одно и то же имя, но различающихся типами параметров, к которым они применяются.
Невозможность применять для разных типов функции с одним именем приводит к необходимости выдумывать различные имена для одного и того же, что создаёт путаницу, а может и приводить к ошибкам. Например, в классическом языке Си существует два варианта стандартной библиотечной функции нахождения модуля числа: abs() и fabs() — первый предназначен для целого аргумента, второй — для вещественного. Такое положение, в сочетании со слабым контролем типов Си, может привести к труднообнаруживаемой ошибке: если программист напишет в вычислении abs(x), где x — вещественная переменная, то некоторые компиляторы без предупреждений сгенерируют код, который будет преобразовывать x к целому путём отбрасывания дробной части и вычислять модуль от полученного целого числа
В ранних версиях C++ нужно было явно формулировать, что функции будут перегружаться с помощью директивы overload. Теперь этого делать не нужно.
Технически перегрузка функций осуществляется достаточно просто. Компилятор в своей работе использует внутренние имена функций, которые существенно отличаются от функций, используемых в программ е. Эти имена содержат в себе скрытое описание типов аргументов. Вследствие этого, мы можем использовать функции с одинаковыми именами, лишь бы типы аргументов у них были разными. На этом основана реализация одной из граней полиморфизма.
С перегрузкой функций связана еще одна возможность C++: использование аргументов по умолчанию. Аргумент по умолчанию позволяет дать входному параметру значение по умолчанию в том случае, если при вызове соответствующий аргумент не задан.
Если в программе предварительно описывается прототип функции, то аргументы по умолчанию указываются в этом прототипе. В качестве аргументов по умолчанию можно использовать только константы или глобальные переменные.
Применение аргумента по умолчанию является простейшей формой перегрузки функций. Понятно, что функция при этом остается одна, следовательно, и алгоритм , реализуемый при вызове этой функции, - один. А в перегруженных функциях могут быть, вообще говоря, реализованы различные алгоритмы.
