Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 67
- 68
- 69
- 70
- 71
- …
- следующая ›
- последняя »