Бьерн Страуструп - Абстракция данных в языке С++ - Полиморфные функции
ОГЛАВЛЕНИЕ
Полиморфные функции
Используя производные классы, можно определить интерфейс,
предоставляющий унифицированный доступ к объектам неизвестных
и/или различных классов. Это может быть использовано для
написания полиморфных функций, т.е. таких функций, в которых
алгоритм специфицирован таким образом, что может быть применен к
аргументам различных типов. Например:
void sort(common *v[], int size)
{
/* сортировка массива элементов типа
common "v[size]" */
}
Функции s o r t необходимо лишь иметь возможность
сравнивать объекты класса c o m m o n для выполнения своей
задачи. Таким образом, если класс c o m m o n имеет виртуальную
функцию c m p r ( ) , s o r t ( ) будет иметь возможность
сортировать массив объектов любого класса, производного от класса
c o m m o n , для которого c m p r ( ) определена. Например:
class common {
...
virtual int cmpr(common *);
};
class apple : public common {
...
int key;
int cmpr(common *arg)
{
/* предполагается, что arg также имеет тип apple */
return (key == k) ? 0 : (key
};
class orange : public common {
...
int cmpr(common *);
};
Былаа выбрана функция c m p r ( ) , не более
привлекательная на первый взгляд перегрузка операцииа "
тремя исходами. Для того, чтобы написать функцию s o r t ( ) для
обработки массива объектов класса c o m m o n , а не массива
указателей на объекты класса c o m m o n , потребуется
виртуальная функция s i z e ( ) (вычисление размера).
Если желательно сравнивать между собой классы a p p l e и
o r a n g e , для функции сравнения потребуется некоторый способ
получения ключа сортировки. Класс c o m m o n мог бы, например,
содержать виртуальную функцию извлечения ключа сортировки.