Замещение или перегрузка операторов и функции отражают одну из ключевых особенностей применения полиморфизма. Применение перегружаемых функций характерно не только для ООП, но в при работе в ООП этот механизм применяется очень часто. Вполне возможно, что Вы уже не раз встречались с применением этого механизма, просто Вы об этом даже не подозревали.
Суть перегрузки функций заключается в том, что в большинстве языков ООП транслятор различает функции не только по именам, но и по типу и количеству аргументов. При этом в некоторых из них даже не требуется явно указывать, что функции являются перегружаемыми, а просто описывают необходимое количество функций с одинаковым именем, но с разным набором параметров. Замечу, что условие применения разных наборов параметров является ОБЯЗАТЕЛЬНЫМ. Но об этом мы еще поговорим.
Для того, чтобы продемонстрировать всю силу и необходимость применения перегрузки рассмотрим маленький пример на С++. Кстати, этот пример в целом относится не конкретно к ООП, а к общим принципам применения перегрузки функций в программировании.
Опишем две функции power с разными наборами аргументов: одна возводит вещественное число, а другая целое число в квадрат.
double power (double x) // функция возвращает // вещественное число и // в качестве параметра имеет // вещественное число { return x*x; // возвращаем квадрат вещественного числа } int power (int x) // функция возвращает целое число // параметр - целое число { return x*x; // возвращаем квадрат целого числа }
Очевидно, что во избежании ошибок для каждого из указанных типов данных (целый и вещественный) нужна отдельная функция. Конечно, можно указать для них разные имена. Но для нас в обоих случаях операция имеет один и тот же смысл - возведение в степень. А название говорит само за себя и логичнее было бы использовать одно и то же название для обеих функций. Для того, чтобы избежать появления путаницы в подобных ситуаций, применяют механизм замещения, когда мы можем описать более одной функции с одним и тем же именем, но с разными наборами параметров.
Применение перегрузки отражает сам смысл перевода понятия полиморфизма - "один интерфейс, множество методов".
Рассмотрим как этот механизм реализован с технической точки зрения. Транслятор в своей работе использует внутренние имена функций, которые существенно отличаются от используемых в программе. Эти имена содержат в себе скрытое описание типов аргументов. С этими же именами работают программы компоновщика и библиотекаря. По этой причине мы можем использовать функции с одинаковыми именами, только типы аргументов у них должны быть разными. Именно на этом и основана реализация одной из особенностей полиморфизма. Заметим, что транслятор не различает функции по типу возвращаемого значения.
Следует отметить, что в языках ООП существуют определенные ограничения на применение замещенных функций и операторов. Эти ограничения зависят от конкретного языка ООП.