Процесс соединения имен с тем, что они есть, называется привязкой . Нормальным разрешением перегрузки является «раннее» связывание, поскольку точное значение имени метода определяется рано - во время компиляции.
Когда компилятор встречает виртуальный метод во время разрешения перегрузки, он генерирует виртуальный вызов. Во время выполнения это перенаправляется на правильный метод, возможно на переопределение.
Когда компилятор встречает динамический объект, он генерирует код для выполнения «позднего» связывания, то есть во время выполнения. Позднее связывание похоже на разрешение перегрузки во время выполнения. Код просматривает аргумент, находит его целое число, ищет правильную перегрузку для вызова и вызывает его.
Ну, это действительно немного больше, чем это. Он кэширует результат поиска и помещает тест, чтобы при следующем запуске кода он мог перейти к правильному вызову правильного метода, если тип аргумента int
.
Это все еще упрощение. В действительности, можно добиться еще нескольких оптимизаций для достижения оптимальной производительности.
См. в этом блоге для более подробного объяснения того, что именно произойдет с вашим примером.