"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора - стр 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, то есть такие, которые должны определяться в производном классе. |
|
|