C++.Бархатный путь




Совместно используемые функции - часть 5


По правилу пересечения выбирается второй вариант функции. И происходит это по двум причинам:

  1. Сопоставление первого фактического параметра вызова функции и первого параметра второй функции оценивается высшим баллом по шкале соответствия параметров, поскольку константа 0 точно сопоставляется с формальным параметром типа int.
  2. Второй параметр вызова сопоставляется со вторым формальным параметром обеих функций. При этом литера 'a' имеет тип char и значение, допускающее целочисленное расширение. Таким образом, имеет место сопоставление с помощью расширения типа.

Вызов считается неоднозначным, если ни один из вариантов совместно используемых функций не даёт наилучшего сопоставления. Вызов также считается неоднозначным, если несколько вариантов функции дают лучшее сопоставление.

Известно, что значением выражения, состоящего из имени функции, является адрес данной функции. Подобные выражения для перегруженных функций недопустимы в силу своей неоднозначности. Транслятор просто не представляет, адрес какой из функций следует определять. Однако всё же определение адреса совместно используемых функций возможно. Это можно осуществить в контексте определения и инициализации указателя на функцию. Необходимую для выбора соответствующей перегруженной функции информацию транслятор получает из спецификации соответствующего указателя.

char* MyFF1 (int,int,int*,float); char* MyFF1 (int,int*,float); /* Прототипы перегруженных функций. */ ::::: char* MyFF1 (int key1, int key2, int* pVal, float fVal) {/* ... */} char* MyFF1 (int XX, int* pXX, float FF) {/* ... */} /* Определения перегруженных функций. */ ::::: char* (*fPointer1) (int,int,int*,float) = MyFF1; /* Определение и инициализация указателя на первую функцию. Транслятор делает правильный выбор. */ char* (*fPointer2) (int,int*,float); /* Определение указателя на вторую функцию. */ fPointer2 = MyFF1; /* И опять транслятор правильно выбирает соответствующую функцию. */ fPointer1(1,2,NULL,3.14); fPointer2(1,NULL,3.14); /* Вызовы функций по указателю. */




Содержание  Назад  Вперед