Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_07_Простое наследование.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
120.32 Кб
Скачать

Производный класс точки

Если у производного класса имеется всего один базовый класс, то говорят о простом наследовании. Следующий пример иллюстрирует простое наследование.

Пример 4 (продолжение).

#include "Coord.h"

// производный класс Dot наследует элементы базового класса Coord

class Dot: public Coord

{

char name;

public:

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

Dot(char Name): Coord(){name=Name;}

Dot(char Name, double X, double Y): Coord(X, Y){name=Name;}

// переопределённые функции-члены

void Input();

void Print();

double Dist(Dot A);

};

void Dot::Print()

{

char S[]="Координаты точки ";

CharToOem(S, S);

cout<<S<<name<<": ";

Coord::Print();

}

void Dot:: Input()

{

char S[]="Введите координаты точки ";

CharToOem (S, S);

cout<<S<<name<<": ";

Coord::Input();

}

double Dot::Dist (Dot A)

{

Dot T('T', A.xx, A.yy);

return T.Hypotenuse();

}

Производный класс Dot унаследовал у своего предка Coord данные-члены x и y, а также функции-члены Print(), Input(), GetX(), GetY(), SetX(), SetY() и Module(). К членам класса Coord он добавляет данное-член name, два конструктора и открытую функцию Dist(). Кроме того, класс Dot переопределяет функции-члены Print() и Input().

Данные-члены x и y объявлены в базовом классе Coord как защищённые (protected), поэтому они доступны в производном классе Dot. Например, функция Dist() член класса Dot содержит обращение к свойству текущего объекта – x, а к свойству параметра функции A с помощью оператора «точка» – A.x. Если данные-члены x и y объявить в базовом классе Coord как закрытые (private), они будут недоступны в производном классе Dot. В этом случае получить значение свойства x можно будет только с помощью функции GetX(), которая унаследована от базового класса.

Поскольку классы Dot и Vec имеют общий базовый класс Coord, то у нас появилась возможность не дублировать алгоритм (теорема Пифагора) двух близких задач – вычисление расстояния между двумя точками и нахождения длины вектора. Для этого мы сделали следующие шаги:

  • функцию вычисления длины гипотенузы Hypotenuse() мы объявили в классе Coord как защищённую. Потомки её унаследуют, но она будет закрытой;

  • в классе Dot мы объявили функцию Dist(Dot A), которая при вычислении расстояния между текущей точкой и заданной использует унаследованную функцию Hypotenuse();

  • в классе Vec мы объявили функцию Module(), которая при вычислении длины вектора использует унаследованную функцию Hypotenuse().

Производный класс вектора

Для решения нашей задачи нам также необходим класс вектора. Вектор характеризуется своими проекциями на оси координат и именем. Несмотря на различный математический смысл данных, нам удобно унаследовать данные-члены x и y у класса Coord. Имя точки и имя вектора имеют одинаковый смысл, но точку мы привыкли обозначать одной буквой, а вектор – двумя. Для хранения этих данных нам требуются разные типы данных – символ и строка. Поэтому имя объекта не является в нашей задаче общей характеристикой, которую можно ввести в абстрактный класс. Таким образом, базовый класс Coord мы будем использовать дважды в качестве родительского класса, что должно уменьшить размер программы.

Пример 4 (продолжение).

#include "Dot.h"

class Vec: public Coord

{

char name[3];

public:

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

Vec (char* pName):Coord(){strncpy(name, pName, 3);}

Vec (char* pName, double X, double Y):Coord (X, Y){strncpy(name, pName, 3);}

Vec (char* pName, Dot A, Dot B);

// переопределённые функции-члены

void Print ();

void Input ();

double Modul(){return Hypotenuse ();}

};