Полиморфизм– это способность объектов в одной цепочке иметь одно имя и разные реализации.
С точки зрения реализации на объектно-ориентированном языке программирования полиморфизм – это способность отличить тип одного объекта от типа другого на этапе выполнения программы, даже если объекты обрабатываются универсальным образом, и компилятор не знает истинного типа каждого из них.
Полиморфизм подразумевает наличие виртуальных функций. Следовательно, класс, который имеет хотя бы одну виртуальную функцию, является полиморфным, а программа, создающая и использующая объекты такого типа, является объектно-ориентированной.
Таким образом, термины "полиморфизм" и "объектно-ориентированное программирование" могут рассматриваться в некотором роде как синонимы.
В полиморфных языках программирования полиморфизм может существовать в трех разновидностях: перегрузка, переопределение и шаблоны.
32. Понятие "перегрузка"?
Перегрузкой (или полиморфизмом ad hoc) называется такая ситуация, когда имеется множество различных функций (тел кода) с одним именем.
При перегрузке полиморфным является имя функции – оно многозначно. То есть можно говорить, что имя функции перегружено, если имеются два (и более) тела кода, связанные с этим именем. Но при этом функции, связанные с перегруженным именем, могут не иметь никакого семантического сходства.
Например, рассмотрим программу, в которой создаются три похожие, но различные функции sqr_it(), каждая из которых возвращает квадрат своего аргумента. Благодаря типу аргумента, компилятор знает, какую функцию вызвать.
#include <iostream.h>
#include <conio.h>
int sqr_it(int i); // объявление функции sqr_it() для значений типа int
double sqr_it(double d); // объявление функции sqr_it() для значений типа double
long sqr_it(long l); // объявление функции sqr_it() для значений типа long
int main()
{
clrscr();
cout<<sqr_it(10)<<"\n";
cout<<sqr_it(11.0)<<"\n";
cout<<sqr_it(9L)<<"\n";
return 0;
}
int sqr_it(int i)
{
cout<<"Вызов функции sqr_it() для аргумента типа int: ";
return i*i;
}
double sqr_it(double d)
{
cout<<"\nВызов функции sqr_it() для аргумента типа double: ";
return d*d;
}
long sqr_it(long l)
{
cout<<"\nВызоы функции sqr_it() для аргумента типа long: ";