14.6 Перегрузка функций |
Вверх Предыдущий Следующий |
Перегрузка функций означает, что функция определена более одного раза, но с разными списками формальных параметров. Списки параметров должны отличаться, типом хотя бы одного элемента. Когда компилятор встречает вызов функции, он просматривает параметры функции, чтобы решить, какую из определенных функций он должен вызывать. Это полезно, когда одна и та же функция должна быть определена для разных типов. Например, в RTL, процедура Dec определена следующим образом: ... Dec(Var I : Longint;decrement : Longint); Dec(Var I : Longint); Dec(Var I : Byte;decrement : Longint); Dec(Var I : Byte); ... Когда компилятор встречает вызов функции Dec, он сначала ищет какую функцию он должен использовать. Поэтому он проверяет параметры в вызове функции, и смотрит, какие функции определены, выбирая ту список параметров которой совпадает. Когда компилятор находит такую функцию, она и вызовется. Если такой функции нет, генерируется ошибка компиляции. Функции, имеющие модификатор cdecl не могут быть перегружены. (С технической точки зрения, компилятор встречая этот модификатор, изменяет имя функции). До версии компилятора 1.9, перегруженные функции необходимо было искать в том же модуле. Теперь компилятор будет продолжать поиск в других модулях, если присутствует ключевое слово overload, и если он не находит соответствующую версию перегруженной функции в одном модуле, Если нет ключевого слова overload, то все перегруженные версии функций должны находиться в том же модуле, методы в классе должны быть определены в том же классе, (т.е. компилятор не будет искать перегруженные методы в родительских классах, если не указано ключевого слова overload). |