Работа конструктора и деструктора
Чтобы более наглядно изучить работу конструкторов и деструкторов базового и производного классов, рассмотрим следующий пример:
Пример 3.
class Coord // базовый класс
{
public:
Coord() {cout <<"Constructor Coord\n";} // конструктор базового класса
~Coord() {cout <<"Destructor Coord\n";} // деструктор базового класса
}
class Dot : public Coord // производный класс – наследник класса Coord
{
public:
Dot() {cout <<"Constructor Dot\n";} // конструктор производного класса
~Dot() {cout <<"Destructor Dot\n";} // деструктор производного класса
}
int main ()
{
Dot A; // создание объекта производного класса
}
Эта программа выводит на экран следующее:
Constructor Coord
Constructor Dot
Destructor Dot
Destructor Coord
При создании экземпляра производного класса автоматически вызывается конструктор базового класса. После того как объект создан, конструктор базового класса становится недоступным. Хотя конструктор базового класса не наследуется, он вызывается только компилятором при конструировании объект производного класса. Конструктор базового класса вызвать явно нельзя.
В отношении деструкторов производных классов также действуют определенные правила. Деструктор производного класса должен выполняться раньше деструктора базового класса (иначе деструктор базового класса мог бы разрушить данные-члены, которые используются и в производном классе). Когда деструктор производного класса выполнит свою часть работы по уничтожению объекта, вызывается деструктор базового класса. Причем вся работа по организации соответствующего вызова возлагается на компилятор и программист не должен заботиться об этом.
Базовый класс координат
В предыдущей лекции мы создали два класса: класс точки Dot и класс вектора Vec. У этих классов существуют идентичные данные-члены x и y, идентичные функции-члены GetX() и GetY(), а также похожие функции-члены Print() и Input(). В данной задаче целесообразно создать абстрактный базовый класс Coord, который будет содержать общие черты поведения класса Dot и класса Vec.
Пример 4.
class Coord
{
protected: // защищённые члены класса, доступны только классам потомкам
double x, y;
double Hypotenuse(){return sqrt(x*x + y*y);}
public:
// конструкторы класса, потомками не наследуются
Coord() {x=0; y=0;}
Coord(double X, double Y) {x=X; y=Y;}
// функции-члены класса, наследуются потомками
void Print ();
void Input ();
inline double GetX () const {return x;}
inline double GetY () const {return y;}
inline void SetX (double X) {x=X;}
inline void SetY (double Y) {y=Y;}
};
void Coord::Print()
{
cout<<"\tx="<<x<<"\ty="<<y<<endl;
}
void Coord::Input()
{
cout<<"\tx="; cin>>x;
cout<<"\ty="; cin>>y;
}
Базовый класс Coord содержит данные-члены x, y и два конструктора. Конструктор класса Coord() параметров не имеет и инициализирует данные-члены нулями. Конструктор класса Coord (double X, double Y) позволяет инициализировать данные-члены заданными значениями.
Функция-член класса Print() позволяет выводить на экран значения данных-членов в виде: x=5 y=6
Функция-член класса Input() позволяет выводить на экран приглашение и вводить значения данных-членов с клавиатуры в виде:
x=5
y=6
Функции-члены класса GetX() и GetY() позволяет возвращать в место вызова значения данных-членов x и y соответственно. Эти функции пригодятся нам в том случае, когда нам потребуются значения закрытых (private) данных-членов за пределами класса, в котором они объявлены.
