ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Виртуальные функции в графическом примере
Давайте рассмотрим еще один пример использования виртуальных функций. На
сей раз это будет доработка программы MULTSHAP из главы 9 «Наследование».
Как уже отмечалось в начале этой темы, вам может понадобиться нарисовать
некоторое число фигур с помощью одного и того же выражения. Это с успехом
осуществляет программа VIRTSHAP. Помните, что компилировать эту программу
следует, используя соответствующий файл для рисования графики, который
описан в приложении Г «Упрощенный вариант консольной графики».
Листинг 11.5. Программа VIRTSHAP
// virtshap.cpp
// Виртуальные функции и геометрические фигуры
#include <iostream>
using namespace std;
#include "msoftcon.h" //для графических функций
///////////////////////////////////////////////////////////
class shape //базовый класс
{
protected:
int xCo, yCo; //координаты центра
color fillcolor; //цвет
fstyle fillstyle; //заполнение
public: //конструктор без аргументов
shape() : xCo(0), yCo(0), fillcolor(cWHITE),
fillstyle(SOLID_FILL)
{ } //конструктор с четырьмя аргументами
shape(int x, int y, color fc, fstyle fs) :
xCo(x), yCo(y), fillcolor(fc), fillstyle(fs)
{ }
virtual void draw() = 0 //чистая виртуальная функция
{
set_color(fillcolor);
set_fill_style(fillstyle);
}
};
///////////////////////////////////////////////////////////
class ball : public shape
{
private:
int radius; //центр с координатами(xCo, yCo)
public:
ball() : shape() //конструктор без аргументов
{ }
//конструктор с пятью аргументами
ball(int x, int y, int r, color fc, fstyle fs)
: shape(x, y, fc, fs), radius(r)
{ }
void draw() //нарисовать шарик
{
shape::draw();
draw_circle(xCo, yCo, radius);
}
};
///////////////////////////////////////////////////////////
class rect : public shape
{
private:
int width, height; //(xCo, yCo) – верхний левый угол
public:
rect() : shape(), height(0), width(0) //конструктор //без аргументов
{ } //конструктор с шестью аргументами
rect(int x, int y, int h, int w, color fc, fstyle fs) :
shape(x, y, fc, fs), height(h), width(w)
{ }
void draw() //нарисовать прямоугольник
{
shape::draw();
draw_rectangle(xCo, yCo, xCo+width, yCo+height);
set_color(cWHITE); //нарисовать диагональ
draw_line(xCo, yCo, xCo+width, yCo+height);
}
};
///////////////////////////////////////////////////////////
class tria : public shape
{
private:
int height; //(xCo, yCo) – вершина пирамиды
public:
tria() : shape(), height(0) //конструктор без аргументов
{ } //конструктор с пятью аргументами
tria(int x, int y, int h, color fc, fstyle fs) :
shape(x, y, fc, fs), height(h)
{ }
void draw() //нарисовать треугольник
{
shape::draw();
draw_pyramid(xCo, yCo, height);
}
};
///////////////////////////////////////////////////////////
int main()
{
int j;
init_graphics(); //инициализация графики
shape* pShapes[3]; //массив указателей на фигуры
//определить три фигуры
pShapes[0] = new ball(40, 12, 5, cBLUE, X_FILL);
pShapes[1] = new rect(12, 7, 10, 15, cRED, SOLID_FILL);
pShapes[2] = new tria(60, 7, 11, cGREEN, MEDIUM_FILL);
for(j=0; j<3; j++) //нарисовать все фигуры
pShapes[j]->draw();
for(j=0; j<3; j++) //удалить все фигуры
delete pShapes[j];
set_cursor_pos(1, 25);
return 0;
}
Спецификаторы классов в этой программе аналогичны спецификаторам из
программы MULTSHAP, за исключением того, что draw() в классе shape стала чистой
виртуальной функцией.
В main() мы задаем массив pShapes указателей на фигуры. Затем создаем три
объекта, по одному из каждого класса, и помещаем их адреса в массив. Теперь
с легкостью можно нарисовать все три фигуры:
pShapes[j]->draw();
Переменная j при этом меняется в цикле.
Как видите, это довольно мощный инструмент для соединения большого
числа различных графических элементов в одно целое.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Схожі підручники
- Загальні питання з курсу Регіональна Економіка
- РЕГІОНАЛЬНА ЕКОНОМІКА. Тексти лекцій онлайн (частина 3)
- Загальні питання з курсу «Теорія ймовірності та Математичної статистики»№1
- Цивільна оборона (частина 2)
- Реферат на тему « Особливості та недоліки оподаткування операцій з недержавного пенсійного забезпечення в Україні »
- Гроші та кредит (частина 1)
