Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
oop12.doc
Скачиваний:
17
Добавлен:
06.02.2016
Размер:
1.13 Mб
Скачать

2. Варианты задания

Создать иерархию классов для цепочки, заданной в таблице. Разработать главную программу для реализации заставки или презентации (придумывается студентом).

Цепочка наследования

1

2

3

4

5

6

7

8

9

0

Shape -> Circle -> Ellipse -> EllipseArc

Shape -> Circle -> Ellipse -> FillEllipse

Shape -> Circle -> CircleArc -> FillCircleArc

Shape -> Circle -> FillCircle -> FillEllipse

Shape -> Sqr -> Rectangle -> FillRect

Shape -> Sqr -> FillSqr -> FillRect

Shape -> Circle -> FillCircle -> FillArc

Shape -> Circle -> Arc -> EllipseArc

Shape -> Circle -> Arc -> FillArc

Shape -> Circle -> FillCircle -> FillArc

3. Содержание отчета

1. Рисунок иерархии классов.

2. Описание и реализация библиотеки классов.

3. Макет размещения графических фигур на экране дисплея.

4. Текст главной программы.

5. Результат работы программы (примеры приведены на рис.5.1).

Рисунок 5.1. Примеры заставок

Лабораторная работа 6 “Множественное наследование”

Цель. Освоение механизма множественного наследования на примере создания графических «кнопок» для реализации интерфейса пользователя.

1. Общие указания

Технология ООП включает механизам наследования от более одного класса. Этот механизм множественного наследования добавлен в C++ версии 22.

Рассморим практический пример для отображения текста внутри окружности. Может показаться очень простым добавление строки в класс Circle и затем отображения ее функцией Circle::Show таким образом, чтобы текст отображался с окружностью вокруг него. Но, в действительности, текст и окружность – совершенно разные вещи. Для текста нам необходимы шрифт, размер символа и другие атрибуты. Но и текст, и окружность должны иметь одинаковый центр для размещения. В этом случае удобно применить базовый класс Location и создать от него две ветви: графический объект и текст, а затем соединить их в одном порожденном классе. Отношения предложенных классов показаны на рисунке ниже.

Рисунок 6.1 – Структура классов

// MCIRCLE.CPP - пример реализации

#include <graphics.h>

#include "point.h" // реализация класса

#include <string.h>

#include <conio.h>

// Иерархия классов Location->Point->Circle, (Circle and GMessage}->MCircle

class Circle : public Point

{

protected:

int Radius;

public:

Circle(int InitX, int InitY, int InitRadius);

void Show(void);

};

class GMessage : public Location

{

char *msg; // сообщение

int Font; // BGI шрифт

int Field; // размер поля для масштабирования текста

public:

GMessage(int msgX, int msgY, int MsgFont, int FieldSize, char *text);

void Show(void); // отобразить сообщение

};

class MCircle : Circle, GMessage // наследование от двух классов

{

public:

MCircle(int mcircX, int mcircY, int mcircRadius, int Font, char *msg);

void Show(void); // отобразить окружность с текстом

};

// реализация Circle

Circle::Circle(int InitX, int InitY, int InitRadius) : Point (InitX, InitY)

{

Radius = InitRadius;

};

void Circle::Show(void)

{

Visible = true;

circle(X, Y, Radius);

}

// реализация для GMessage

GMessage::GMessage(int msgX, int msgY, int MsgFont, int FieldSize, char *text) :

Location(msgX, msgY)

// X и Y устанавливаются конструктором класса Location равными msgX, msgY

{

Font = MsgFont;

Field = FieldSize;

msg = text;

};

void GMessage::Show(void)

{

int size = Field / (8 * strlen(msg)); // 8 пикселов на символ

settextjustify(CENTER_TEXT, CENTER_TEXT); // центрированный вывод

settextstyle(Font, HORIZ_DIR, size); // установить стиль

outtextxy(X, Y, msg); // отобразить текст

}

// реализация дляr MCircle

MCircle::MCircle(int mcircX, int mcircY, int mcircRadius, int Font, char *msg) :

Circle(mcircX, mcircY, mcircRadius), GMessage(mcircX,mcircY,Font,2*mcircRadius,msg)

{

}

void MCircle::Show(void)

{

Circle::Show();

GMessage::Show();

}

main() // пример использования

{

int graphdriver = DETECT, graphmode;

initgraph(&graphdriver, &graphmode, "c:..\\bgi");

MCircle Small(250, 100, 25, SANS_SERIF_FONT, “You”);

Small.Show();

MCircle Medium(250, 150, 100, TRIPLEX_FONT, “World”);

Medium.Show();

MCircle Large(250, 250, 225, GOTHIC_FONT, “Universe”);

Large.Show();

getch();

closegraph();

return 0;

}

Рассмотрим некоторые особенности. В реализации MCircle::Show вы видите два вызова функции Circle::Show(); и GMessage::Show();. Этот синтаксис показывает другое общее использование (::). Когда необходимо наследовать функции, такую как Show, компилятор нуждается в подсказке: какая Show требуется? Без дополнительного указания Show() булет ссылаться на Show() в текущем описании, названную MCircle::Show(). Для вызова Show() других классов (естественно, если это разрешено), перед ее именем необходимо указывать имя класса, затем :: и имя функции (с аргументами, если они необходимы).

Теперь немного пояснений к конструктору MCircle. Конструктор Point получает координаты расположения от конструктора Location. Так как MCircle наследует от обоих Circle и GMessage, конструктор MCircle может быть инициализирован путем вызова конструкторов этих классов:

MCircle::MCircle(int mcircX, int mcircY, int mcircRadius, int font, char *msg) :

Circle(mcircX, mcircY, mcircRadius), GMessage(mcircX, mcircY, 2*mcircRadius,msg)

{

}

Тело конструктора пустое, потому что все необходимые данные он получает через инициализацию конструкторов-родителей в списке елементов инициаоизации (после символа : вводится список инициализирующих выражений, разделенных запятыми). Когда конструктур MCircle активизируется (например, при объявлении объекта типа МCircle), автоматически происходит установка начальных параметров. Первым вызывается конструктор Circle. Этот конструктор вызывает конструктор Point, который, в свою очередь, вызывает конструктор Location. Наконец, вызывается конструктор GMessage, который опять вызывает, теперь уже свою, копию конструктора Location для установки своих параметров X и Y. Аргументы, которые даны в конструкторе MCircle, передаются для инициализации соответствующих данных памяти базовых классов.

Следует обратить внимание, что в качестве размера поля для масштабирования сообщения передается удвоенное значение радиуса окружности (2*mcircRadius ), тем самым осуществляется «вписывание» сообщение в окружность.

В результате работы программы получаются окружности разного размера с сообщениями, отображенными различными по величине символами.

Рисунок 6.3 – Окружность с вписанным в нее сообщением

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]