Шаг 9 - Перегружаемые (overload) функции и операторы

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

Суть перегрузки функций заключается в том, что в большинстве языков ООП транслятор различает функции не только по именам, но и по типу и количеству аргументов. При этом в некоторых из них даже не требуется явно указывать, что функции являются перегружаемыми, а просто описывают необходимое количество функций с одинаковым именем, но с разным набором параметров. Замечу, что условие применения разных наборов параметров является ОБЯЗАТЕЛЬНЫМ. Но об этом мы еще поговорим.

Для того, чтобы продемонстрировать всю силу и необходимость применения перегрузки рассмотрим маленький пример на С++. Кстати, этот пример в целом относится не конкретно к ООП, а к общим принципам применения перегрузки функций в программировании.

Опишем две функции power с разными наборами аргументов: одна возводит вещественное число, а другая целое число в квадрат.

double power (double x) // функция возвращает 
  // вещественное число и 
  // в качестве параметра имеет 
  // вещественное число  
{
return x*x;  // возвращаем квадрат вещественного числа
}

int power (int x) // функция возвращает целое число
				//  параметр - целое число
{
return x*x;  // возвращаем квадрат целого числа
}

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

Применение перегрузки отражает сам смысл перевода понятия полиморфизма - "один интерфейс, множество методов".

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

Следует отметить, что в языках ООП существуют определенные ограничения на применение замещенных функций и операторов. Эти ограничения зависят от конкретного языка ООП.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Valeri Khromov - 5.02.2000