Если найдены два сопоставления по
Если найдены два сопоставления по самому приоритетному правилу, то вызов считается неоднозначным, а значит ошибочным. Эти правила сопоставления параметров работают с учетом правил преобразований числовых типов для С и С++. Пусть имеются такие описания функции print:
void print(int); void print(const char*); void print(double); void print(long); void print(char);
Тогда результаты следующих вызовов print() будут такими:
void h(char c, int i, short s, float f) { print(c); // точное сопоставление: вызывается print(char) print(i); // точное сопоставление: вызывается print(int) print(s); // стандартное целочисленное преобразование: // вызывается print(int) print(f); // стандартное преобразование: // вызывается print(double)
print('a'); // точное сопоставление: вызывается print(char) print(49); // точное сопоставление: вызывается print(int) print(0); // точное сопоставление: вызывается print(int) print("a"); // точное сопоставление: // вызывается print(const char*) }
Обращение print(0) приводит к вызову print(int), ведь 0 имеет тип int. Обращение print('a') приводит к вызову print(char), т.к. 'a' - типа char.
Отметим, что на разрешение неопределенности при перегрузке не влияет порядок описаний рассматриваемых функций, а типы возвращаемых функциями значений вообще не учитываются.
Исходя из этих правил можно гарантировать, что если эффективность или точность вычислений значительно различаются для рассматриваемых типов, то вызывается функция, реализующая самый простой алгоритм. Например:
int pow(int, int); double pow(double, double); // из <math.h> complex pow(double, complex); // из <complex.h> complex pow(complex, int); complex pow(complex, double); complex pow(complex, complex);
void k(complex z) { int i = pow(2,2); // вызывается pow(int,int) double d = pow(2.0,2); // вызывается pow(double,double) complex z2 = pow(2,z); // вызывается pow(double,complex) complex z3 = pow(z,2); // вызывается pow(complex,int) complex z4 = pow(z,z); // вызывается pow(complex,complex) }
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий