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

20.5.Абстрактные классы

Абстрактным называется класс, в котором есть хотя бы одна чистая виртуальная функция. Чистой виртуальной функцией называется функция-член, которая имеет следующее определение:

virtual <ТИП><ИМЯ_ФУНКЦ>(<СПИСОК_ФОРМАЛЬН_ПАРАМ>) = 0;

Конструкция = 0 называется чистый спецификатор.

Следующая функция является чистой виртуальной:

virtual void fpure(void) = 0;

Чистая виртуальная функция ничего не делает и недоступна для вызовов. Она служит основой для подменяющих ее функций в производных классах.

Абстрактный класс может быть использован только как базовый класс для производных классов. Нельзя создавать объекты абстрактных классов. Механизм абстрактных классов разработан для представления общих понятий, которые в дальнейшем предполагается конкретизировать. Эти общие понятия, обычно, невозможно использовать непосредственно. Например, можно говорить об общем понятии «фигура» на плоскости. Это понятие включает свойства, присущие любой конкретной фигуре: треугольнику, прямоугольнику, окружности. Например, у любой фигуры есть свойство цвет. Но изобразить можно всегда только конкретную фигуру, а не фигуру вообще.

Программа 63. Абстрактный класс фигур

В программе создан абстрактный класс Figure фигур на плоскости, который включает общие свойства, имеющиеся у любой фигуры: координаты центра, цвет, и общие для всех фигур методы: изображения на экране, стирания с экрана, перемещения по экрану. Функция рисования сделана чистой виртуальной. На базе абстрактного класса Figure определены конкретные классы эллипсов и прямоугольников. Для рисования фигур на экране используется графическая система TC.

// Файл Figure.h

#ifndef FIGUREH

#define FIGUREH

class Figure{ // Класс фигур на плоскости

int x, y; // Координаты центральной точки фигуры

int color; // Цвет фигуры

public:

int& GetX(){return x;} // Доступ к центральной

int& GetY(){return y;} // точке

int GetClr() {return color;} // Доступ к цвету

Figure(int xx, int yy, int clr): x(xx), y(yy) // Конструктор

{color = clr;}

virtual void Show(int clr)=0; // Чистая виртуальная функция

// рисования фигуры

void Hide(); // Скрыть изображение

void Move(int dx, int dy); // Переместить фигуру на dx и dy

void Movement(); // Движение, пока не нажата ESC

};

#endif

// Файл Figure.CPP

#include "Figure.h"

#include<graphics.h>

void Figure::Hide() // Убирает изображение фигуры

{

int bk = getbkcolor(); // Цвет фона

int cc = getcolor(); // Цвет рисования

Show(bk); // Рисуем цветом фона (стираем)

setcolor(cc); // Восстанавливаем цвет рисования

}

void Figure::Move(int dx, int dy) // Перемещение фигуры

{

Hide(); // Удаляем изображение

x+=dx; y+= dy; // Изменяем координаты

Show(color); // Показываем фигуру на новом месте

}

#include <conio.h>

void Figure::Movement() // Движение при нажатии клавиш

{ // со стрелками, пока не нажата Esc

const int UP = 72, DOWN = 80, // Константы

RIGHT = 77, LEFT = 75, ESC = 27; / /для кодов клавиш

char c = 32;

while(c != ESC){ // Пока не нажата клавиша Esc

c = getch();

if(c == 0) { // Возможно нажата одна из клавиш-стрелок

c = getch();

switch(c){

case LEFT: Move(-1, 0); break;

case RIGHT: Move(1, 0); break;

case UP: Move(0, -1); break;

case DOWN: Move(0, 1); break;

} // switch

} // if(c == 0)

} // while

}

// Файл Demoabst.cpp

#include"Figure.h"

#include<conio.h>

#include<graphics.h>

class Ellipse : public Figure{ // Класс эллипсов

unsigned int a, b; // Полуоси эллипса

public:

Ellipse(int x0, int y0, int ai, int bi, int clr): // Конструктор

Figure(x0, y0, clr), // Вызов конструктора базового класса

a(ai), b(bi) // Вызов конструкторов членов класса

{ } // Пустое тело конструктора класса Ellipse

void Show(int clr) // Рисование эллипса

{

int cc = getcolor(); // Запоминаем цвет рисования

setcolor(clr); // Устанавливаем для рисования цвет фигуры

ellipse(GetX(), GetY(), 0, 360, a, b); // Вызов функции для рисования

setcolor(cc); // Восстанавливаем прежний цвет рисования

}

};

class Rect : public Figure{ // Класс прямоугольников со сторонами,

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

unsigned int a, b; // Стороны прямоугольника

public:

Rect(int x0, int y0, int ai, int bi, int clr): // Конструктор

Figure(x0, y0, clr), // Вызов конструктора базового класса

a(ai), b(bi) // Вызов конструкторов членов класса

{} // Пустое тело конструктора класса Rect

void Show(int clr) // Рисование прямоугольника

{

int cc = getcolor(); // Запоминаем цвет рисования

setcolor(clr); // Устанавливаем для рисования цвет фигуры

// Вызов функции для рисования

rectangle(GetX() - a / 2, GetY() - b / 2, GetX() + a / 2, GetY() + b / 2);

setcolor(cc); // Восстанавливаем прежний цвет рисования

}

};

#include<iostream.h>

void main()

{

Ellipse E(100, 200, 80, 50, YELLOW); // Создаем желтый эллипс

Rect R(100, 200, 100, 50, BLUE); // Создаем синий прямоугольник

int dr = DETECT, mod;

// Инициализация графики

initgraph(&dr, &mod, "D:\\Programs\\Tc30\\BGI");

E.Show(E.GetClr()); getch(); // Вызов функции Ellipse::Show()

R.Show(R.GetClr()); getch(); // Вызов функции Rect::Show()

E.Movement(); getch(); // Вызов функции Figure::Movement() для

// объекта E производного класса Ellipse

R.Movement(); getch(); // Вызов функции Figure::Movement() для

// объекта R производного класса Rect

closegraph(); // Закрытие графического режима

}

Примерный вид картинки на экране показан на рис.79. Программа после создания изображений эллипса и прямоугольника ждет нажатия клавиш-стрелок и перемешает сначала эллипс. При нажатии клавиши Esc «активным» становится прямоугольник, который также можно подвигать.

Рис.79. Картинка на экране, создаваемая программой 63

Для рисования эллипса на экране использована функция

void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius);

которая рисует на экране дугу эллипса установленным цветом рисования. Здесь x, y – координаты центра эллипса, xradius, yradius – полуоси, stangle, endangle – начальный и конечный углы, отсчитываемые от оси x против часовой стрелки.

Прямоугольник рисуется функцией

void rectangle(int left, int top, int right, int bottom);

Здесь left, top – координаты левого верхнего угла прямоугольника, right, bottom – координаты правого нижнего угла.