Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Наследование.doc
Скачиваний:
16
Добавлен:
18.04.2015
Размер:
169.47 Кб
Скачать

Void show()

{ spot::show(); // показать пятно

ellips::show();} // показать эллипс

Void hide()

{spot::hide(); // убрать пятно

ellips::hide(); // убрать эллипс

}

};

Void main ( )

{ int dr = DETECT , mod=DETECT ;

// int far*t=&dr; int far *q= &mod;

initgraph ( &dr , &mod , "D:\\Borlandc\\BGI" );

int errorcode=graphresult();

if(errorcode!=grOk){cout<<"Ошибка " ; exit(0);}

setcolor(4) ;

setfillstyle(1,4);

{ spotelli a1(100,100,20,80);

spotelli a2(400,300,230,100);

a1.show();getch();

a2.show(); getch();

a2.hide(); getch();

a1.hide();getch();

}

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

При наследовании, особенно множественном могут возникать неоднозначности при доступе к одноименным компонентам разных базовых классов.

Способ устранения неоднозначностей – использование квалифицированных имен компонент (включающих имена классов и операцию принадлежности “::”).