На этом шаге мы приведем пример определения производного класса.
Чтобы проиллюстрировать некоторые особенности механизма наследования, построим на основе класса point
производный класс star (звезда). Наследуемые компоненты класса point:
- int x, у - координаты символа на экране;
- point() - конструктор;
- givex(),givey() - доступ к координатам символа;
- show() - изобразить символ;
- move() - переместить символ.
Дополнительно к наследуемым компонентам в класс star введем:
- длину лучей (rad);
- ее видимость на экране (vis == 0, когда изображения нет на экране, vis == 1 - изображение есть на
экране).
// 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
Текст этого класса можно взять 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, необходимо рассмотреть особенности использования
деструкторов при наследовании.
На следующем шаге мы приведем дополнительные сведения о деструкторах.