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

Файл Vec.Cpp

#include "Vec.h"

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

Coord (B.GetX()–A.GetX(), B.GetY()−A.GetY())

{

strncpy(name, pName, 3);

}

void Vec::Print()

{

char S[]="Проекции вектора ";

CharToOem (S, S);

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

Coord:: Print();

}

void Vec::Input()

{

char S[]="Введите проекции вектора ";

CharToOem(S, S);

cout<<S<<name<<'\n';

Coord::Input();

}

Интерфейс класса Vec аналогичен, в основном, интерфейсу класса Dot. Обратим внимание на третий конструктор Vec (char *N, Dot A, Dot B), который получает в качестве параметров имя вектора и две точки – начало и конец вектора. Описание конструктора достаточно громоздко и поэтому мы расположили его не в интерфейсе класса, а в файле описаний функций.

Данный конструктор вызывает конструктор базового класса Coord(double X, double Y) и передаёт ему вычисленные проекции вектора (проекции вектора=координаты конца–координаты начала). Для получения координат точки используются функции GetX() и GetY() – члены класса Dot, которые он унаследовал от базового класса Coord. Тело конструктора использует значение первого параметра для инициализации имени объекта.

Файл Main.Cpp

#include "Vec.h"

void main()

{

Dot C('C', 3, 4), D('D');

C.Print(); D.Print();

cout<<"CD="<<C.Dist(D)<<'\n';

Vec CD("CD", C, D);

CD.Print();

сout<<"|DC|="<<CD.Modul()<<'\n';

}

Эта программа выводит на экран следующее:

Координаты точки C: x=3 y=4

Координаты точки D: x=0 y=0

CD=5

Проекции вектора CD: x=-3 y=-4

|CD|=5

Использование конструктора с параметрами

Рассмотрим теперь, как строится конструктор производного класса, предоставляемый программистом. Поскольку производный класс должен унаследовать все члены родительского, при построении объекта своего класса он должен обеспечить инициализацию унаследованных данных-членов.

Данные-члены производного класса могут использовать значения данных-членов родительского класса. Поэтому инициализацию унаследованных данных-членов класса должна быть выполнена до инициализации данных-членов производного класса. Конструктор производного класса строится с использованием следующего синтаксиса:

<констр_произв_класса>(<список_параметров>):

<констр_базового_класса>(<список_аргументов>){<тело_конструктора>}

Здесь используется список инициализации элементов, в котором указывается конструктор базового класса. Часть параметров, переданных конструктору производного класса, обычно используется в качестве аргументов конструктора базового класса. Затем в теле конструктора производного класса выполняется инициализация данных-членов, принадлежащих собственно этому классу.

Первый конструктор класса Dot имеет вид: Dot(char Name):Coord(){name=Name;} При вызове этого конструктора сначала вызывается конструктор базового класса Coord(), который инициализирует унаследованные данные-члены x и y нулями. Затем в теле конструктора данное-член name инициализируется значением параметра конструктора Name.

Второй конструктор класса Dot имеет вид: Dot(char Name, double X, double Y): Coord(X, Y){name=Name;}. При вызове второго конструктора сначала вызывается конструктор базового класса Coord (double X, double Y), который инициализирует унаследованные данные-члены x и y значениями параметров конструктора X и Y. Затем в теле конструктора данное-член name инициализируется значением параметра конструктора Name.