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 - цвет точки на экране.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.