Объектно-ориентированное программирование на C++


Полиморфизм и виртуальные методы


О классе, содержащем виртуальный метод, говорят как о полиморфном классе. В чем же преимущество полиморфных классов?

Самое главное в том, что полиморфные классы допускают обработку объектов, тип которых неизвестен во время компиляции. Функции, описанные в базовом классе как виртуальные, могут быть модифицированы в производных классах, причем связывание произойдет не на этапе компиляции (то, что называется ранним связыванием), а в момент обращения к данному методу (позднее связывание).

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



Содержание раздела