- •Наследование
- •Наследование классов
- •Классы union не могут использоваться при наследовании! Определение производных классов: сlass t : X, y , z {…} ;
- •Void main ( )
- •Передача параметров в базовый класс
- •Конструкторы с инициализацией по умолчанию в иерархии классов
- •Класс “точка на графическом экране”. Производный класс –“пятно”
- •Void point :: show (void)
- •Void point ::move ( int xn, int yn )
- •Int&point::GetX (){return X;}
- •Int& point:: GetY(void) {return y;}
- •Initgraph( тип графического драйвера, режим адаптера , путь к драйверу)
- •Void far initgraph (int far * graphdriver, int far * graphmode, char far * pathtodriver);
- •Void main ( )
- •Рассмотрим класс “ пятно”
- •Int size;
- •Void main ( )
- •Множественное наследование. Виртуальные базовые классы
- •Рассмотрим множественное наследование на примере.
- •Void show ()
- •Объект базового класса point дублируется:
- •Spotelli
- •Void show()
- •Void hide()
- •Void show()
- •Void hide()
- •Void main ( )
- •Class a { // самый верхний базовый класс а
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);}
};
void main ( )
{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
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) {} // с центром эллипса
//Конструктор производного класса не выполняет никаких действий