Правила описания виртуальных методов.
- 1. Если в объекте метод определен как виртуальный, во всех потомках он также должен быть виртуальным.
- 2. Заголовки всех одноименных виртуальных методов должны совпадать.
- 3. Переопределять виртуальный метод в каждом из потомков не обязательно: если он выполняет устраивающие потомка действия, он будет унаследован.
- 4. Объект, имеющий хотя бы один виртуальный метод, должен содержать конструктор.
- 5. При описании объектов рекомендуется определять как виртуальные те методы, которые в его потомках будут реализовываться по-другому.

Рис. 6.7. Механизм виртуальных методов
Объекты в динамической памяти
Для хранения объектов в программах чаще всего используется динамическая память, поскольку это более эффективно. Благодаря расширенной совместимости типов можно описать указатель на базовый класс и хранить в нем ссылку на любой его объект-потомок, что в сочетании с виртуальными методами позволяет единообразно работать с различными классами иерархии. Из объектов и указателей на них создают различные динамические структуры.
Для выделения памяти под объекты используются процедура и функция new. Например, если определены указатели:
type
pmonster = Amonster; pdaemon = Adaemon;
var pm : pmonster; pd : pdaemon;
можно создать объекты с помощью вызовов: new (pm); {или pm:= new (pmonster);} new (pd); {или pd:= new (pdaemon);}
Так как после выделения памяти объект обычно инициализируют, для удобства определены расширенные формы new со вторым параметром — конструктором объекта: new (pm, init (1, 1, 1, 1);
{или pm := new (pmonster, init (1, 1, 1, 1));} new (pd, init (1, 1, 1, 1, 1);
{или pd := new (pdaemon, init (1, 1, 1, 1, 1));} Обращение к методам динамического объекта выполняется по обычным правилам:
pm^.draw; pmA.attack;
С объектами в динамической памяти часто работают через указатели на базовый класс, т.е. описывают указатель базового класса, а инициализируют его, создав объект производного класса: pm : = new (pdaemon, init (1, 1, 1, 1, 1));
Такие объекты называют полиморфными. Они используются, для того чтобы можно было работать с объектами разных классов единообразно.