Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.docx
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
68 Кб
Скачать

1.3 Полиморфизм

Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования. Он означает взаимозаменяемость объектов с одинаковым интерфейсом и позволяет одно и тоже имя использовать для решения нескольких технически разных задач.

Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами — из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции .

Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования

Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Это означает, что общие свойства объектов объединяются в систему, которую могут называть по-разному — интерфейс, класс. Таким образом создается общий интерфейс для группы близких по смыслу действий. Общность имеет внешнее и внутреннее выражение. Внешне общность проявляется как одинаковый набор методов с одинаковыми именами и типами аргументов и результатов. Внутренняя общность есть одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов, правил, которым должны подчиняться методы.

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

Полиморфизм в языке С++ применим к функциям и операциям (имеются в виду операции типа +, =, [ ] и др.).

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

2. Объектно-ориентированные средства С++

2.1 Перегружаемые (overload) функции

Одна из ключевых черт полиморфизма в C++ - замещение или перегрузка функций.

Транслятор языка C++ различает функции не только по именам, но и по типам входных параметров (но не по типам возвращаемого значения). Перегрузка функций — один из способов реализации полиморфизма, заключающийся в возможности одновременного существования в одной области видимости нескольких различных вариантов функции, имеющей одно и то же имя, но различающихся типами параметров, к которым они применяются.

Невозможность применять для разных типов функции с одним именем приводит к необходимости выдумывать различные имена для одного и того же, что создаёт путаницу, а может и приводить к ошибкам. Например, в классическом языке Си существует два варианта стандартной библиотечной функции нахождения модуля числа: abs() и fabs() — первый предназначен для целого аргумента, второй — для вещественного. Такое положение, в сочетании со слабым контролем типов Си, может привести к труднообнаруживаемой ошибке: если программист напишет в вычислении abs(x), где x — вещественная переменная, то некоторые компиляторы без предупреждений сгенерируют код, который будет преобразовывать x к целому путём отбрасывания дробной части и вычислять модуль от полученного целого числа

В ранних версиях C++ нужно было явно формулировать, что функции будут перегружаться с помощью директивы overload. Теперь этого делать не нужно.

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

С перегрузкой функций связана еще одна возможность C++: использование аргументов по умолчанию. Аргумент по умолчанию позволяет дать входному параметру значение по умолчанию в том случае, если при вызове соответствующий аргумент не задан.

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

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