Файл 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.
