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

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) {} // с центром эллипса

//Конструктор производного класса не выполняет никаких действий