Я рекомендую вам прочитать C ++ Primer . Эта концепция объясняется подробно.
На более высоком уровне допустима перегрузка функции, если обе функции
- имеют то же имя
- заявлено в том же объеме
- имеет другой список параметров.
На нижнем уровне (внутри того, как это вычисляет компилятор), вот как это делается.
Для разрешения перегрузки функций предусмотрено 3 шага.
e.g void f();
void f(int);
void f(double, double = 3.4);
void f(char *, char *);
Function call inside main -> void f(5.6);
Определяет набор перегруженных функций, рассматриваемых для вызова, они вызываются как функции-кандидаты. Функция-кандидат - это функция с тем же именем, что и вызываемая функция, и для которой объявление видно в точке вызова.
Он также определяет свойства списка аргументов в вызове функции, т. Е. Нет аргументов и их типы.
Выбрано: Все 4 функции с именем 'f'
Выбирает функцию из набора функций-кандидатов, найденных на шаге 1, которые можно вызывать с аргументами, указанными в вызове. Они называются жизнеспособными функциями.
Жизнеспособная функция - это функция, которая имеет то же самое число параметров или больше параметров (параметры addn имеют связанный аргумент по умолчанию), чем аргументы в реальном вызове функции. Типы аргументов должны быть конвертируемыми, чтобы функция была классифицирована как жизнеспособная.
Выбрано: void f (int) и void (double, double = 3.4)
Определяет лучшую жизнеспособную функцию среди всех жизнеспособных функций.
Для (int) преобразования необходимо применить, которое является стандартным преобразованием (double to int). Но для (double, double = 3.4) точное совпадение, поэтому преобразование не требуется. Нет конверсии лучше, чем конверсия.
Выбрано: void (double, double = 3.4)