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

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

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

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

class circle: public shape (* int radius; public: void draw(); void rotatte(int i) (**) //... *);

Теперь, если shape_vec – вектор фигур, то можно написать:

for (int i = 0; i«no_of_shapes; i++) shape_vec[i].rotate(45);

чтобы повернуть все фигуры на 45 градусов (и заново нарисовать)

Такой стиль особенно полезен в интерактивных программах, когда объекты разных типов одинаково обрабатываются основным


программным обеспечением. Ведь по сути дела, типичное действие пользователя – это ткнуть в какой-нибудь объект и сказать Кто ты? Что ты такое? и Делай, что надо! не давая никакой информации о типе. Программа может и должна уяснить это для себя сама.

Загрузка...