ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн

Наследование и графика

В программе CIRCLES главы 6 «Объекты и классы» мы видели программу, в кото- рой класс был создан для вывода на экран кругов. Конечно, кроме кругов суще- ствует еще множество других фигур: квадраты, треугольники. Слово «фигура» является обобщением, не затрагивающим определенный тип. Используем это при создании программы более сложной, но более понятной, чем программа, ко- торая рисует различные фигуры, не используя их общих характеристик.

В частности, мы создадим класс shape как базовый класс и три производных класса: circle, rect (для прямоугольников) и tria (для треугольников). Как и в дру- гих программах, мы используем здесь функции консольной графики. Обратитесь к приложению Д «Упрощенный вариант консольной графики», приложению В «Microsoft Visual C++» или приложению Г «Borland C++ Builder», чтобы по- нять, как встроить графические файлы в программу в вашем компиляторе. При- ведем листинг программы MULTSHAP:

// multshap.cpp

// геометрические фигуры

#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 )

      { }

    // функция установки цвета и стиля

 

    void draw ( ) const

      {

        set_color ( fillcolor );

        set_fill_style ( fillstyle );

      }

};

///////////////////////////////////////////////////////////

class circle : public shape

{

  private:

    int radius; // радиус, а xCo и yCo будут координатами центра

  public:

    // конструктор без параметров

    circle ( ) : shape ( )

      { }

    // конструктор с пятью параметрами

    circle ( int x, int y, int r, color fc, fstyle fs ) : shape ( x, y, fc, fs ), radius ( r )

      { }

        void draw ( ) const // функция рисования окружности

      {

        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 ( ) const// функция рисования прямоугольника

      {

        shape::draw ( );

        draw_rectangle ( xCo, yCo, xCo + width, yCo + height );

        // нарисуем диагональ

        set_color ( xWHITE );

        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 ( ) const

      {

        shape::draw ( );

        draw_pyramid( xCo, yCo, height );

      }

};

///////////////////////////////////////////////////////////

int main ( )

{

  init_graphics ( ); // инициализируем систему отображения графики

 

  circle cir ( 40, 12, 5, cBLUE, X_FILL );      // создаем круг

  rect rec ( 12, 7, 10, 15, cRED, SOLID_FILL ); // создаем прямоугольник

  tria tri ( 60, 7, 11, cGREEN, MEDIUM_FILL );  // создаем пирамиду

 

  // рисуем все наши фигуры

  cir.draw ( );

  rec.draw ( );

  tri.draw ( );

 

  set_cursor_pos( 1, 25 ); // переводим курсор в самый низ экрана

  return 0;

}

Эта программа рисует три различных фигуры: голубой круг, красный прямо- угольник и зеленый треугольник. Результат работы программы MULTSHAP пока- зан на рис. 9.6.

Общие характеристики всех фигур, такие, как их расположение, цвет, стиль заполнения, размещены в классе shape. Отдельные фигуры имеют более опреде- ленные атрибуты. Например, круг имеет радиус, а прямоугольник имеет шири- ну и высоту. Метод draw() класса shape содержит в себе действия, определенные для каждой из фигур: устанавливает их цвет и стиль заполнения. Перегрузка метода draw() в классах circle, rect и tria отвечает за прорисовку характерной для каждой фигуры формы.

Рис. 9.6. Результат работы программы MULTSHAP

Базовый класс shape является примером абстрактного класса, в котором не приписывается значение объекту класса. Вопрос, какой формы будет нарисован объект класса shape, не имеет смысла. Мы можем вывести на экран только оп- ределенную форму. Класс shape существует только как хранилище атрибутов и действий, общих для всех фигур.

 

24