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

Void show(void)

{ circ::show(); square::show(); }

// Убрать с экрана изображение:

Void hide()

{ square::hide(); circ::hide (); }

};

Void main()

{ int dr = DETECT, nod;

initgraph(&dr,&mod,"с:\\borlandc\\bgi");

circsqrt Al(100,100,60);

circsqrt F4(400,300,50); A1.3how() ; getch() ; F4.3how() ; getch() ; F4.hide() ; getch() ; Al.hide() ; getch() ; closegraph() ; }

Определения базовых классов должны предшествовать их исполь­зованию в качестве базовых. Поэтому тексты из файлов square. cpp и circ.cpp включены в начало программы, после чего описывается класс circaqrt. В производном классе circsqrt телом конструктора служит пустой оператор. Выполнение конструктора circsqrt () сво­дится к последовательному вызову конструкторов базовых классов. При этом за счет соответствующего выбора параметров центры обеих фигур (квадрата и окружности) совпадают. Кроме того, длина сторо­ны квадрата выбирается равной удвоенному радиусу окружности (параметр 2 * ri), и тем самым окружность оказывается вписанной в квадрат.

В основной программе формируются два объекта a1, F4 класса circsqrt. Они последовательно выводятся на экран дисплея (рис. 10.4) и в обратном порядке убираются с экрана.

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

При множественном наследовании никакой класс не может больше одного раза использоваться в качестве непосредственного базового. Однако класс может больше одного раза быть непрямым базовым классом:

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

В данном примере класс х дважды опосредованно наследуется классом D. Особенно хорошо это видно в направленном ациклическом графе (НАГ):

Проиллюстрированное дублирование класса соответствует вклю­чению в производный объект нескольких объектов базового класса. В нашем примере существуют два объекта класса х, и поэтому для устранения возможных неоднозначностей вне объектов класса D нуж­но обращаться к конкретному компоненту класса х, используя полную квалификацию: D::Y::X::f() ИЛИ D::Z::X::f(). Внутри объекта класса d обращения упрощаются: У: :х: :f о или Z: :X: :f(), но тоже содержат квалификацию.

В качестве содержательного примера с дублированием непрямого базового класса рассмотрим программу, в которой определен класс spotelli - круглое пятно, вписанное в эллипс. Класс spotelli непо­средственно базируется на классах spot и ellips, каждый из которых базируется, в свою очередь, на классе point. Таким образом, point дважды входит в spotalli в качестве непрямого базового класса, т.е. дублируется. Класс point (точка на экране) уже рассматривался. Текст его определения находится в файле point.срр (см. п. 9.4). Опре­деление производного от класса point класса spot (круглое пятно на экране) находится в файле spot.cpp (см. п. 10.1). На базе класса point можно следующим образом определить класс "эллипс":

//ELLIPS.CPP - класс "эллипс"

#ifnde£ ELLIPS

#define ELLIPS 1

#include "point.cpp" // Определение класса point

class ellips : public point

{ protected: int rx,ry; // Радиусы эллипса public:

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

ellips (int xc, int yc, int rx, int ry):

point (xc,yc)

{ this->rx = rx; this->ry = ry; }