Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 21

          a_ob1.a2+=1;}                 //допустимаяоперация (a_ob1.a2=a_ob1.a2+1)

При создании иерархии классов права доступа должны передаваться с осторожностью. Обычно в С++ принята практика защиты данных класса от методов, не принадлежащих данному классу и не являющихся другом данного класса.

Рассмотрим еще один пример, демонстрирующий наследование прав доступа к компонентам базовых классов:

          #include <iostream.h>    //подключение файлов описания

          #include <graphics.h>    //прототипов библиотечных функций

          #include <conio.h>

          class Location {    protected:

          int x,y;         // эти компоненты будут доступны в производном классе

          public:

          Location(int InitX,int Init Y); // конструктор для класса Location

          int getx() { cout << "x= " << x <<"\n"; return x; }

          //метод возвращает и распечатывает значение х

          int gety() { cout << "y= " << y <<"\n"; return y; }

          //метод возвращает и распечатывает значение y

          void show_mess() { cout << "Нажмите любую клавишу"; }

          //метод выдает сообщение на экран

};        //конец описания класса Location

          /* Класс Point является производным от базового класса Location */

          /****************************************************************************/

          class Point : public Location    //определение наследования

          { int color;                       //собственное тело класса Point

          public:

          Point(int Init X, int InitY, int InitC); // конструктор

          void putpixel() { ::putpixel(x,y,color); }

          //метод вывода изображения точки

// (использует библиотечную функцию putpixel

//для вывода точки с координатами x, y и цветом - color

          };                           //конец описания класса Point

          Location::Location(int Init X, int InitY)          // конструктор класса Location

          {x = Init X; y = InitY);

          cout << "работает конструктор Location\n"; }

          Point::Point(int Init X, int InitY, int InitC) :

          Location(Init X, InitY) {color = InitC;

          // конструктор Point сначала вызывает

//выполнение конструктора базового класса Location

          cout << "работает конструктор Point\n"; }

void main(void)

          { int gd = DETECT, gn;

          initgraph(&gd,&gn,""); // инициализация графического режима

          Point my_point(300,200,4);       //определение объекта my_point

          my_point.putpixel();                  //рисование точки для объекта my_point

          my_point.getx();                       //вызов метода базового класса getx

          my_point.gety();                       //вызов метода базового класса gety

          void show_mess();                   //вызов метода выдачи сообщения

          getch();                           // приостановка до нажатия любой клавиши

          clossegraph();}               // закрытие графической системы

Приведенный пример иллюстрирует работу механизма наследования. В базовом классе Location объявлены переменные x и y с атрибутом доступа protected. Это значит, что они будут доступны для методов производного класса. С атрибутом public в Location объявлен конструктор и 3 метода getx() и gety(), show_mess().

Класс Point является производным от класса Location. Так как базовый класс имеет конструктор, то и все производные классы должны иметь конструктор. Обратим внимание на то, что конструктор класса Point сначала инициирует вызов конструктора класса Location и передает ему параметры, необходимые для создания экземпляра объекта базового класса, который (неявно) будет существовать в составе создаваемого объекта класса Point. Значения переменных InitX и InitY, используемые для приема извне и передачи значений внутренним переменным класса, интерпретируются здесь как горизонтальная и вертикальная координаты точки, а InitC - цвет точки на экране.