"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора

- стр 45 -

только объекты данного типа. Последнее легко достигается с помощью
производного класса. Вы можете, например, создать вектор
указателей на apple:

class apple_vector : public cvector {
public:
apple*& elem(int i)
{ return (apple*&) cvector::elem(i); }
//...
};

используя запись приведения к типу (тип)выражение, чтобы
преобразовать common*& (ссылку на указатель на common), которую
возвращает cvector::elem, в apple*&. Такое применение производных
классов создает альтернативу обобщенным классам. Писать его немного
труднее (если не использовать макросы таким образом, чтобы
производные классы фактически реализовывали обобщенные классы; см.
#7.3.5), но оно имеет то преимущество, что все производные классы
совместно используют единственную копию функции базового класса. В
случае обобщенных классов, таких, как vector(type), для каждого
нового используемого типа должна создаваться (с помощью
implement()) новая копия таких функций. Другой способ, хранение
идентификации типа в каждом объекте, приводит нас к стилю
программирования, который часто называют объекто-основанным или
объектно-ориентированным.

1.18 Виртуальные функции

Предположим, что мы пишем программу для изображения фигур на
экране. Общие атрибуты фигуры представлены классом shape, а
специальные атрибуты - специальными классами:

class shape {
point center;
color col;
//...
public:
void move(point to) { center=to; draw(); }
point where() { return center; }
virual void draw();
virtual void rotate(int);
//...
};

Функции, которые можно определить не зная точно определенной фигуры
(например, move и where, то есть, "передвинуть" и "где"), можно
описать как обычно. Остальные функции описываются как virual, то
есть такие, которые должны определяться в производном классе.