Бьерн Страуструп - Абстракция данных в языке С++ - Полиморфные функции

ОГЛАВЛЕНИЕ

 

        Полиморфные функции

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

      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 мог бы, например,
  содержать виртуальную функцию извлечения ключа сортировки.