Ранее связывание с помощью переопределяемых функций
Действие механизма переопределяемых функций несколько сходно с
механизмом функции переключателя switch, используемого в Паскале. Однако, если switch, в зависимости от значения, выполняет тот или иной
блок процедур, то переопределяемые функции, в зависимости от заданных
аргументов вызывают и выполняют, тот или иной код, используя одно и
то же имя функции. Дело в том, что компиляторы Турбо и Borland С++,
различают функции не только по их именам, но и по типу их аргументов.
Достичь полиморфизма через "игру" с аргументами можно: потерей
одного из аргументов (осторожно, так чтобы компилятор не спутал
отсутствие аргумента с особой "потерей" аргументов, принимаемыми "по
умолчанию", описываемыми далее), изменить тип аргумента, или использовать различное число аргументов. Например, функцию, вычисляющую
площадь прямоугольника
double sqr (double x, double y){return x*y;}
можно дополнить одноименной, но вычисляющей площадь квадрата, имеющую
отличный тип у аргумента x и меньшее число параметров:
int sqr (int x){return x*x;}
Компилятор предварительно просматривает содержащиеся в функции
типы и по отличию в типе аргумента определяет ту или иную функцию.
Переопределяемые функции
v v v
double sqr (double x, double y); int sqr(int x);
{ { ^
return x*y; return x * x;
} }
int i, k;
Проверка типов
v v
k = add(i);
Как вы видите наблюдается некоторая дополнительная работа (компилятора языка С++ по отношению к Си), при раннем связывании функций
объектов - проверка типов.
Однако нужно иметь в виду, что компилятор не отличит эти же
функции, если тип аргумента сделать одинаковым, а изменить лишь тип
возвращаемого значения, например:
double sqr (double x){return x*x;};
и
int sqr (double x){return x*x;}