Полиморфизм и виртуальные методы
О классе, содержащем виртуальный метод, говорят как о полиморфном классе. В чем же преимущество полиморфных классов?
Самое главное в том, что полиморфные классы допускают обработку объектов, тип которых неизвестен во время компиляции. Функции, описанные в базовом классе как виртуальные, могут быть модифицированы в производных классах, причем связывание произойдет не на этапе компиляции (то, что называется ранним связыванием), а в момент обращения к данному методу (позднее связывание).
Виртуальные методы описываются с помощью ключевого слова virtual в базовом классе. Это означает, что в производном классе этот метод может быть замещен методом, более подходящим для этого производного класса. Объявленный виртуальным в базовом классе, метод останется виртуальным для всех производных классов. Если в производном классе виртуальный метод не будет переопределен, то при вызове будет найден метод с таким именем вверх по иерархии классов (т.е. в базовом классе).
Перепишем нашу иерархию классов.
class Point
{
...
public:
...
virtual void Show ();
virtual void Hide ();
void MoveTo (int newX, int newY);
};
...
реализация методов класса Point
...
class Circle: public Point
{
...
public:
... // без метода MoveTo()
virtual void Show ();
virtual void Hide ();
};
...
реализация методов класса Circle
...
Прежде всего, заметим, что в классе Circle нет метода MoveTo(), он наследуется из класса Point.
При этом все вызовы отложенных в MoveTo() методов будут методами класса Circle, так как они являются виртуальными методами.