Предположим, у нас описана процедура:
procedure Swap(a, b: integer);begin var v := a; a := b; b := v;end; Возможно ли описать процедуру с таким же именем, параметры которой были бы вещественными? Да, возможно:
procedure Swap(a, b: integer);begin var v := a; a := b; b := v;end; procedure Swap(a, b: real); begin var v := a; a := b; b := v;end; Таким образом, в одном пространстве имен можно описать несколько подпрограмм с одним именем, но разными типами или количеством формальных параметров.
При вызове такой подпрограммы на этапе компиляции типы фактических параметров сравниваются с типами формальных для всех версий этой подпрограммы и выбирается наиболее подходящая.
Замечание 1. Тип возвращаемого значения функции не участвует в операции разрешения перегрузки.
Версии подпрограммы с одним именем называются перегруженными, а определение того, какую версию выбрать — разрешением перегрузки.
Замечание 2. Разрешить перегрузку можно не всегда.
Пример.
procedure p(i: integer; r: real);...procedure p(r: real; c: char);...procedure p(r: real; i: integer);... begin p(1, 2); //неоднозначностьend. Замечание 3. В процессе разрешения перегрузки происходит неявное преобразование типов.