Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
}
closegraph(); }
Чтобы устранить дублирование объектов непрямого базового класса при множественном наследовании, этот базовый класс объявляют виртуальным.
Причем это делается не в объявлении самого базового класса (А), а в классах, производных от него.
class A { // самый верхний базовый класс А
protected:
Int x;
... };
class B: public virtual A { // класс В, производный от А
... };
class C: public virtual A { // класс С, производный от А
... };
class D: public B, public C { // класс D, производный и от В и от С
... };
Теперь объект класса D будет включать только один экземпляр класса A и к переменной x в классе D можно обращаться просто по имени, т.к. она существует в единственном экземпляре. Графически это выглядит так:
A
B C
D
Отметим, что виртуальность класса – это не свойство класса, а результат особенностей процедуры наследования.
Один и тот же класс при множественном наследовании может, включен в производный класс при непрямом наследовании и как виртуальный и как не виртуальный.
X X X
B Y Z C
A
class X {...};
class Y: virtual public X {... };
class Z: virtual public X {... };
class B: public X {... };
class C: public X {... };
class A: public B, public Y, public Z, public C {... };
Объект класса А включает три экземпляра класса X: один виртуальный, общий для классов Y и Z, и два не виртуальных, относящихся к классам В и С.
Виртуальный класс может быть прямым родителем:
class X {... };
class A: virtual public X {... };
class B: virtual public X {... };
class D: public A, public B, virtual public X {... };
X
A B
D
При наследовании, особенно множественном могут возникать неоднозначности при доступе к одноименным компонентам разных базовых классов.
Способ устранения неоднозначностей – использование квалифицированных имен компонент (включающих имена классов и операцию принадлежности “::”).
Дата публикования: 2014-11-28; Прочитано: 213 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!