Объектно-ориентированное программирование на языке С++. Лясин Д.Н - 68 стр.

UptoLike

Составители: 

68
вертикали и горизонтали, как ладья). Поэтому класс Queen объявлен потомком
двух классов: Castle и Bishop. Таким образом, имеется иерархия классов,
изображенная на рис.10.
Приведенный пример реализации класса Queen содержит ошибку. Дело в том,
что для класса Queen дублируются компонентные данные vert, hor и color, в то
время как у реального ферзя всего одна позиция
на доске и один цвет. Таким
образом, встала задача предотвратить дублирование компонент непрямого
базового класса в производном. Решить эту проблему можно, объявив класс
Figure виртуальным.
Для того, чтобы определить непрямой базовый класс виртуальным,
необходимо при объявлении этого класса базовым в списке порождения указать
ключевое слово virtual. Спецификатор virtual способствует минимизации
структуры
производного класса. Главная особенность виртуальных базовых
классов - они не тиражируются. Изменим определение классов шахматных фигур.
class Figure {…};
class Castle: public virtual Figure {…};
class Bishop: public virtual Figure {…};
class Castle: public Castle, public Bishop{…};
Теперь схема иерархии классов выглядит так, как показано на рис.11, и
компонентные данные vert, hor, color не будут дублироваться в объектах класса
Queen.
Figure
Вishop
Queen
Рисунок 11. - При использовании виртуальных классов схема иерархии классов
принимает ромбовидную форму
Castle
вертикали и горизонтали, как ладья). Поэтому класс Queen объявлен потомком
двух классов: Castle и Bishop. Таким образом, имеется иерархия классов,
изображенная на рис.10.
  Приведенный пример реализации класса Queen содержит ошибку. Дело в том,
что для класса Queen дублируются компонентные данные vert, hor и color, в то
время как у реального ферзя всего одна позиция на доске и один цвет. Таким
образом, встала задача предотвратить дублирование компонент непрямого
базового класса в производном. Решить эту проблему можно, объявив класс
Figure виртуальным.
      Для того, чтобы определить непрямой базовый класс виртуальным,
необходимо при объявлении этого класса базовым в списке порождения указать
ключевое слово virtual. Спецификатор virtual способствует минимизации
структуры производного класса. Главная особенность виртуальных базовых
классов - они не тиражируются. Изменим определение классов шахматных фигур.
  class Figure {…};
  class Castle: public virtual Figure {…};
  class Bishop: public virtual Figure {…};
  class Castle: public Castle, public Bishop{…};


      Теперь схема иерархии классов выглядит так, как показано на рис.11, и
компонентные данные vert, hor, color не будут дублироваться в объектах класса
Queen.

                 Figure


         Вishop           Castle

                 Queen
Рисунок 11. - При использовании виртуальных классов схема иерархии классов
                            принимает ромбовидную форму

                                                   68