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

Void show() // Изобразить на экране эллипс

{ ellipse(x,y,0,360,rx,ry);

return; } // Убрать с экрана изображение эллипса:

Void hide() { int cc, bk;

cc = getcolor () ;

bk = getbkcolor () ;

setcolor (bk) ;

ellipse(x,y,O,360,rx,ry);

setcolor(cc); }

};

# endif

Как уже отмечалось, определение базового класса должно предшествовать его упоминанию в списке базовых классов. Поэтому в начале текстов spot.cpp и ellips.cpp помещена препроцессорная директива включения текста определения класса point.

В классе ellips конструктор предусматривает задание четырех параметров: координаты центра (хс, ус) и радиусы вдоль осей (rх, гу). Координаты хс, ус используются в качестве параметров при вызове конструктора базового класса point. Чтобы различить компоненты rх, rу класса ellips и обозначенные теми же идентификатора-ми формальные параметры конструктора, используется указатель this. В классе ellips две общедоступные функции show() - изобразить эллипс на экране дисплея; hide() - убрать с экрана изображение эллипса.

Текст программы:

//Р10-03.СРР - круглое пятно в эллипсе - множественное

// наследование с дублированием базовых

// классов (дублируется класс point)

#include "spot.cpp"

#include "eilips.cpp"

// Производный класс - дважды косвенно наследующий

// класс point:

class spotelli: public spot, public ellips { // Вспомогательная функция:

Int min(int valuel, int value2)

{ return ( (valuel < value2) (valuel : value2); }

public:

// Конструктор:

spotelli(int xi,int yi,int rx,int ry) : ellips(xi,yi,rx,ry), spot(xi,yi,min(rx,ry))

{}

// Вывести изображение на экран дисплея:

Void show()

( spot::show();

ellips::show(); }

Void hide() // Убрать изображение с экрана дисплея

{ spot: :hide() ;

ellips: :hide() ; }

};

#include <conio.h> // Для функции

getch()

void main() { int dr = DETECT, mod;

initgraph(&dr,&mod,"c:\\borlandc\\bgi"); { spotelli Al (100,100,20,80); spotelli F4(400,300,230,100); Al.ahow() ; getch() ; F4.show() ; getch() ; F4.hide() ; getch() ; Al.hide() ; }

closegraph(); }

В классе ellips, в классе spot и в классе spotelli наследуются данные х, у класса point - координаты точки на экране. В классе point они определены как защищенные (protected) и сохраняют тот же статус доступа в производных классах, где определяют координаты центров- пятна (класс spot), эллипса (класс ellips) и эллипса с пят­ном (класс spotelli).

Класс spot мы уже разбирали.

Рис. 10.5. Последовательность изображений на экране при выполнении программы Р10-03 .СРР

Конструктор класса spotelli не выполняет никаких дополни­тельных действий - последовательно вызываются конструкторы клас­са ellips и класса spot, причем центры создаваемых фигур совпадают, а в качестве радиуса пятна выбирается меньший из радиу­сов эллипса. Используемая в этом случае функция min() определена по умолчанию как встроенная (inline) собственная (private) функция класса spotelli.

Чтобы отличать одинаково обозначенные функции, унаследован­ные классом spotelli из классов spot и eliips, при вызове show о и hide () используются полные квалифицированные имена, в которых применена операция '::'.

Функция main () не содержит ничего нового. Описаны два объекта Al, F4 класса spotelli, которые последовательно изображаются на экране и "стираются" с него.

Чтобы устранить дублирование объектов непрямого базового класса при множественном наследовании, этот базовый класс объявляют виртуальным. Для этого в списке базовых классов перед именем класса необходимо поместить ключевое слово virtual. Например, класс х будет виртуальным базовым классом при таком описании:

class X { ... f (); ... }; class Y: virtual public X { ... }; class Z: virtual public X { ... }; class D: public Y, public Z { ... };

Теперь класс d будет включать только один экземпляр х, доступ к которому равноправно имеют классы Y и z. Графически это очень на­глядно:

Иллюстрацией сказанного может служить иерархия классов в сле­дующей программе:

//Р10-04.СРР - множественное наследование с виртуальным

// базовым классом

#include <iostream.h>

class base // Первичный (основной) базовый класс

{ int jj; char cc; char w[10] ; public:

base(int j = 0, char с = '*')

{ jj = j;

cc = c; }

};

class dbase: public virtual base { double dd; public:

dbase(double d = 0.0) : base()

{ dd = d; } };

class fbase: public virtual base { float ff; public:

fbase(float f = 0.0): base() { ff = f; } };

class top: public dbase, public fbase { long tt; public:

top (long t = 0) : dbase (), fbase () { tt - t; } };