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

UptoLike

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

69
При использовании виртуальных классов необходимо обратить внимание на
особенность вызова конструкторов базовых классов. Конструктор класса Queen
был определен следующим образом:
Queen(char x, int y, int z): Castle (x, y, z), Bishop (x, y, z)
{}
В конструкторе предусмотрен вызов конструкторов прямых
базовых классов, которые создают в памяти экземпляры классов Castle и
Bishop . В свою очередь, конструкторы классов Castle и Bishop вызыва-
ют конструктор своего базового класса (Figure), вследствие чего и соз-
давалось два экземпляра класса Figure. Если класс Figure объявлен вир-
туальным, конструктор класса Queen необходимо переопределить
:
Queen(char x, int y, int z): Castle (x, y, z), Bishop (x, y, z), Figure(x,y,z)
{}
Если Figureвиртуальный класс, то конструкторы классов Castle и Bishop
не будут вызывать конструктор класса Figure, а для того, чтобы один экземпляр
этого объекта все таки был создан, вызов конструктора класса Figure необходимо
поместить непосредственно в определение класса Queen.
При множественном наследовании существует возможность определять
один и тот же базовый класс как
косвенный базовый для другого класса несколько
раз, причем и как виртуальный, и как невиртуальный. Рассмотрим следующий
пример:
class A {…};
class B: virtual public A {…};
class C: virtual public A {…};
class D: public A{…};
class E: public A {…};
class F: public B, public C, public D, public E {…};
Схема иерархии для такой системы классов в графической форме приведена
на рис.12.
      При использовании виртуальных классов необходимо обратить внимание на
особенность вызова конструкторов базовых классов. Конструктор класса Queen
был определен следующим образом:
        Queen(char x, int y, int z): Castle (x, y, z), Bishop (x, y, z)
        {}
                            В конструкторе предусмотрен вызов конструкторов прямых
             базовых классов, которые создают в памяти экземпляры классов Castle и
             Bishop . В свою очередь, конструкторы классов Castle и Bishop вызыва-
             ют конструктор своего базового класса (Figure), вследствие чего и соз-
             давалось два экземпляра класса Figure. Если класс Figure объявлен вир-
             туальным, конструктор класса Queen необходимо переопределить:
        Queen(char x, int y, int z): Castle (x, y, z), Bishop (x, y, z), Figure(x,y,z)
        {}
      Если Figure – виртуальный класс, то конструкторы классов Castle и Bishop
не будут вызывать конструктор класса Figure, а для того, чтобы один экземпляр
этого объекта все таки был создан, вызов конструктора класса Figure необходимо
поместить непосредственно в определение класса Queen.
      При множественном              наследовании существует возможность определять
один и тот же базовый класс как косвенный базовый для другого класса несколько
раз, причем и как виртуальный, и как невиртуальный. Рассмотрим следующий
пример:
      class A {…};
      class B: virtual public A {…};
      class C: virtual public A {…};
      class D: public A{…};
      class E: public A {…};
      class F: public B, public C, public D, public E {…};
      Схема иерархии для такой системы классов в графической форме приведена
на рис.12.




                                                    69