Шаг 23.
Пример определения производного класса

    На этом шаге мы приведем пример определения производного класса.

    Чтобы проиллюстрировать некоторые особенности механизма наследования, построим на основе класса 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, необходимо рассмотреть особенности использования деструкторов при наследовании.

    На следующем шаге мы приведем дополнительные сведения о деструкторах.




Предыдущий шаг Содержание Следующий шаг