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

5. Требования к отчету

1. Обоснование выбора структуры памяти класса и его интерфейса.

2. Блок-схемы алгоритмов функций обработки (ПО3).

3. Описание класса + схемы (ПО2, ПО4).

4. Результаты тестирования класса.

5. Заключение и рекомендации по совершенствованию класса и/или тестирующей программы.

6. Контрольные вопросы

  1. Как объявить динамическую строку в С++?

  2. Какие вы знаете функции работы со строками?

  3. Как определяются строки при передаче в функцию, в качестве фактических параметров?

ЛАБОРАТОРНАЯ РАБОТА №5

“Механизм создания порожденных классов. Наследование”

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

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

Для создания иерархии классов геометрических фигур необходимо определить их общие свойства:

- все фигуры имеют центр (или точку привязки), т.е. переменные X,Y целого типа;

- установка значений центра выполняется при помощи SetCenter();

- все фигуры «хотят быть нарисованными», т.е. иметь функцию-метод Draw().

class Shape

{

protected:

int X,Y; // the center

public:

Shape();

~Shape();

void SetCenter(int x, int y);

virtual void Draw() {};

};

Реализация класса достаточно проста.

Shape::Shape()

{

X=150; Y=100;

}

Shape::~Shape()

{

}

void Shape::SetCenter(int x, int y)

{

X=x; Y=y;

}

Однако, отрисовка различных фигур выполняется по-разному, поэтому функция Draw() объявлена, но не реализована. Эта функция объявлена «виртуальной» в соответствии с правилами С++, которые предоставляют возможность реализовать ее в порожденных классах.

Пусть класс Shape будет базовым классом для двух порожденных классов: Circle и Rectangle. Порожденные классы содержат более детальную инфомацию и, конечно, известно, как можно нарисовать окражность и прямоугольник..

class Circle : public Shape

//синтаксис определения

{

//порожденного класса

int Radius;

public:

Circle();

virtual ~Circle();

void SetRadius(int r) {Radius = r;};

virtual void Draw();

};

Circle::Circle() :Shape()

{

Radius = 100;

}

Circle::~Circle()

{ }

void Circle::Draw()

{

circle(X,Y,Radius);

}

class Rectangle : public Shape

{

int Height, Width;

public:

Rectangle();

void SetSides(int w, int h);

virtual void Draw();

};

Rectangle::Rectangle() : Shape()

{

Width = 100; Height =100;

}

void Rectangle::SetSides(int w, int h)

{

Width = w; Height= h;

}

void Rectangle::Draw()

{

rectangle(X-Width/2,Y-Height/2,X+Width/2,Y+Height/2);

}

Таким образом, мы создали следующую иерархию:

Заметим, что класс Circle имеет дополнительное свойство – радиус, поэтому память класса содержит переменную Radius, которая может быть задана функцией-методом SetRadius(). Подобным образом класс Rectangle имеет ширину и высоту (переменные Width и Height), которые устанавливаются функцией SetSides(). От класса Shape оба эти класса наследуют координаты центра X,Y и функцию SetCenter().

В классе Shape мы определили

virtual void Draw(){};

с пустым телом функции {}, потому что неизвестно, как рисовать фигуру. В классах Circle и Rectangle функции Draw() переопределены, т.е. функция Shape::Draw() будет заменена функцией Circle::Draw() и функцией Rectangle::Draw(). Это можно отразить в следующей таблице отношений классов:

класс Circle

класс Rectangle

int X; int Y;

наследовал

int X; int Y;

SetCenter();

SetCenter();

int Radius;

добавил

int Width;

SetRadius();

int Height;

SetSides();

Draw();

переопределил

Draw();

Заметим, что, если глубина иерархии более 2, то целесообразно указывать, от какого класса данный класс является порожденным и, соответственно, наследует данные и функции.

Ниже приведен пример главной программы для тестирования классов Shape, Circle и Rectangle:

#include <graphics.h>

#include <conio.h>

Описание и реализация классов Shape, Circle и Rectangle

main()

{

int graphdriver = DETECT;

int graphmode;

initgraph(&graphdriver,&graphmode,””);

Circle c1;

Rectangle r1;

for (int i=50; i<150; i+=10) {

c1.SetCenter(i,i);

c1.SetRadius(50);

c1.Draw();

r1.SetCenter(i,i);

r1.SetSides(100,100);

r1.Draw();

}

getch();

closegraph();

}

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