Void hide ()
{int a,b; int t = len/2;
a= getbkcolor (); // функция возвращает цвет фона
b= getcolor (); // функция возвращает цвет символов и линий
setcolor (a);
rectangle (x-t, y-t, x+ t, y+ t); // рисуем квадрат цветом фона
setcolor (b); // восстанавливаем цвет символов
}
void move (int xn, int yn)
{ hide();
x= xn; y= yn;
show(); }
};
// множественное наследование
#include <conio.h.
#include ”circ.cpp”
#include “square.cpp”
class cirsqu: public circ, public square {
// производный класс двух базовых классов, нет своих данных
public:
cirsqu(int xi, int yi, int ri): // конструктор, параметры для
// инициализации данных базовых классов
circ(xi, yi, ri), // явно вызываются конструкторы
square(xi, yi, 2*ri) { } // базовых классов
//так чтобы координаты центра окружности и квадрата совпадали,
// а сторона квадрата была равна диаметру окружности
void show ()
{circ::show(); square::show();}
void hide()
{ circ::hide(); square::hide();}
void move(int xn,int yn)
{circ::move(xn,yn); square::move(xn,yn);}
};
{int d=DETECT, m;
initgraph(&d, &m, "D:\\Borlandc\\BGI");
int errorcode=graphresult();
if(errorcode!=grOk){cout<<"Ошибка "; exit(0);}
cirsqu a1(100,100,50);
cirsqu a2(400,300,30);
a1.show(); getch();
a2.show(); getch ();
a2.move(50,50); getch();
a2.hide(); getch();
a1.hide(); getch();
|
|
closegraph();
}
Виртуальные базовые классы
При множественном наследовании класс не может быть прямым базовым более одного раза. Однако класс может быть неоднократно косвенно базовым.
class A { // самый верхний базовый класс А
protected:
int x;
... };
class B: public A { // класс В, производный от А
... };
class C: public A { // класс С, производный от А
... };
class D: public B, public C { // класс D, производный и от В и от С
... };
A A
B C
D
В этом случае происходит дублирование или “размножение” базового класса при множественном наследовании.
В объект класса D входят все составляющие базовых классов B и C и следовательно члены класса А войдут в него дважды, как составляющие базового класса В и как составляющие базового класса С. В результате переменная x будет присутствовать в двух экземплярах.
С точки зрения компилятора такая ситуация не является ошибочной. Однако при обращении к x придется его однозначно специфицировать.
class D: public B, public C {
public:
int GetX() {return x} // не допустимо
int GetX () { return B::x; } // x получено через В
SetX (_x) { C::x = _x;} // x получено через С
};
Ниже представлена программа дублирования базового класса.
Класс “ круглое пятно, вписанное в эллипс ” – spotelli базируется на классах spot (“ пятно”) и ellips (“ эллипс”), каждый из которых базируется на классе point.
Объект базового класса point дублируется:
point point
spot ellips