Spotelli
// 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(); // убрать эллипс
}
};
{ 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