Функция перегрузка (по крайней мере, в C ++) обрабатывается внутри компилятора. Идея состоит в том, что код, который в конечном итоге генерирует компилятор, будет жестко задан для вызова соответствующей функции, как если бы все функции имели разные имена, и вы вызвали функцию, уникально подходящую для аргументов. В более общем случае, в большинстве компилируемых языках, которые поддерживают перегрузку, разрешение перегрузки выполняется во время компиляции, и выданный код всегда будет вызывать указанную функцию. Например, Haskell поддерживает перегрузку во время компиляции таким образом.
Перегрузка оператора является частным случаем общей перегрузки, поэтому обычно она обрабатывается одинаково.
Функция переопределение (термин, который возникает в ООП, когда производный класс наследует от базового класса и переопределяет один из его методов), почти всегда разрешается во время выполнения, поскольку компилятор не всегда может сказать, какой Функция будет вызываться без фактического знания типов во время выполнения. Некоторые компиляторы могут быть в состоянии статически доказать, что определенный объект имеет определенный тип, а затем оптимизировать динамическую отправку, но это невозможно сделать во всех случаях.
Мне неизвестны какие-либо динамические языки, поддерживающие перегрузку, поскольку теоретически вы могли бы вводить новых кандидатов на перегрузку во время работы программы. Я хотел бы быть просветленным, если такой язык существует.