|
// ellips.cpp
#ifndef ELLI
# define ELLI 1
# include”point.cpp”
class ellips: public point {
protected:
int rx, ry; //радиусы эллипса
public:
ellips (int xi, int yi, int rxi, int ryi): point(xi,yi)
{rx = rxi; ry =ryi;}
Void show()
{ ellipse (x,y,0,360,rx,ry); }
Void hide()
{int a, b;
a= getcolor();
b=getbkcolor();
Setcolor(b);
Ellipse (x,y,0,360,rx,ry);
Setcolor(a);
}
};
#endif
// текст программы
#include “spot.cpp”
#include”ellips.cpp”
// класс “пятна в эллипсе”
class spotelli: public spot, public ellips {
int min(int a, int b){return((a<b)?a:b);} // вспомогательная функция
public:
spotelli(int xi, int yi, int rxi, int ryi):
spot(xi, yi, min(rxi,ryi)), // координаты центра пятна совпадают
ellips(xi, yi, rxi, ryi) {} // с центром эллипса
// Конструктор производного класса не выполняет никаких действий
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
При наследовании, особенно множественном могут возникать неоднозначности при доступе к одноименным компонентам разных базовых классов.
Способ устранения неоднозначностей – использование квалифицированных имен компонент (включающих имена классов и операцию принадлежности “::”).
Дата добавления: 2015-07-15; просмотров: 95 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Void move ( int xn, int yn) | | | Наследственное право |