На этом шаге мы приведем пример определения производного класса.
Чтобы проиллюстрировать некоторые особенности механизма наследования, построим на основе класса point производный класс star (звезда). Наследуемые компоненты класса point:
Дополнительно к наследуемым компонентам в класс star введем:
// STAR.CPP - класс, наследующий данные и методы // класса POINT. #ifndef STAR #define STAR 1 #include <conio.h> //Для функции gotoxy(); #include "point.cpp" // Определение класса point. class star: // public позволит сохранить статусы доступа для // наследуемых компонентов класса POINT: public point { // Статус доступности данных в производных классах: protected: int rad; // Длина лучей звезды. int vis; // Видимость звезды на экране. public: // Конструктор класса STAR: star (int xi, int yi, int ri): // Вызов конструктора базового класса: point(xi,yi) { vis = 0; rad = ri; } ~star() // Деструктор класса STAR. { hide(); // Убрать с экрана изображение звезды. } void show(); // Изобразить звезду на экране дисплея. void hide(); // Убрать с экрана изображение звезды. // Переместить изображение: void move(int xn, int yn) { hide(); // Убрать старое изображение с экрана. // Изменить координаты центра звезды: x = xn; y = yn; show(); // Вывести изображение в новом месте. } // Изменить размер лучей звезды: void vary(float dr) { float a; hide(); // Убрать старое изображение с экрана. // Вычислить новый радиус: a = dr * rad; if (a <= 0) rad = 0; else rad = (int)a; show(); // Изобразить звезду на экране. } int& giver(void) //Доступ к длинам лучей. { return rad; } }; void star::show() // Изобразить звезду на экране дисплея. { // Если звезда не отображена на экране: if (vis == 0) { // Изобразить звезду: gotoxy(x,y); cout << "*"; for (int i=1;i<=rad;i++) { gotoxy(x+i,y); cout << "*"; gotoxy(x-i,y); cout << "*"; gotoxy(x,y+i); cout << "*"; gotoxy(x,y-i); cout << "*"; } for (i=-rad;i<=rad;i++) { gotoxy(x+i,y+i); cout << "*"; gotoxy(x-i,y+i); cout << "*"; } vis = 1; } } void star::hide() // Убрать с экрана изображение звезды. { if (vis == 0) // Нечего убирать. return; // Стереть изображение с экрана: gotoxy(x,y); cout << " "; for (int i=1;i<=rad;i++) { gotoxy(x+i,y); cout << " "; gotoxy(x-i,y); cout << " "; gotoxy(x,y+i); cout << " "; gotoxy(x,y-i); cout << " "; } for (i=-rad;i<=rad;i++) {gotoxy(x+i,y+i); cout << " "; gotoxy(x-i,y+i); cout << " "; } vis = 0; } #endif
В классе star явно определены конструктор, деструктор ~star() и пять методов:
Из класса point класс star наследует координаты (х, у) точки (центра звезды) и методы givex(), givey(). Методы point::show(), point::move() заменены в классе star новыми функциями с такими же именами, а функция point::hide() не наследуется, так как в классе point она имеет статус собственного компонента (private).
Конструктор star() имеет три параметра - координаты центра (xi, уi) и радиус пятна на экране (ri). При создании объекта класса star вначале вызывается конструктор класса point, который по значениям фактических параметров, соответствующих xi, yi, определяет точку - центр звезды. Эта точка создается как безымянный объект класса point. (Конструктор базового класса всегда вызывается и выполняется до конструктора производного класса.) Затем выполняются операторы конструктора star(). Здесь устанавливаются начальные значения признака vis и по значению фактического параметра, соответствующего формальному параметру ri, определяется длина лучей звезды rad. На этом работа конструктора заканчивается.
Назначение функции vary() - изменение длины лучей звезды.
Прежде чем привести пример программы с классом star, необходимо рассмотреть особенности использования деструкторов при наследовании.
На следующем шаге мы приведем дополнительные сведения о деструкторах.