Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ - ООП.doc
Скачиваний:
15
Добавлен:
21.09.2019
Размер:
399.87 Кб
Скачать

Конструкторы с параметрами при наследовании

Рассмотрим пример. Класс X задает переменную х, класс У задает переменную у, класс Z содержит переменную z, которая будет содержать произведение x*y. Каждый из классов содержит функцию void show(void). В примере продемонстрировано использование функций, имеющих одинаковые имена в базовом и производном классах. Обе эти функции доступны, так как у них различаются полные имена, соответственно Z::show(), X::show(), Y::show(). На этом примере можно проводить эксперименты, изменяя режимы доступа к переменным х и у, режимы доступа при наследовании классов.

#include <iostream.h>

// простое наследование, конструкторы с параметрами

class X {

protected:

int x;

public:

X(int i); // Конструктор с параметром

~X(void); // Деструктор

void put_x(int i) { x = i;}

int get_x(void) { return x;}

void show(void);

};

class Y:public X {

protected:

int y;

public:

Y(int i, int j); // Конструктор с параметром

~Y(void); // Деструктор

void put_y(int i) { y = i;}

int get_y(void) { return y;}

void show(void);

};

class Z:public Y{

protected:

int z;

public:

Z(int i, int j); // Конструктор с параметром

~Z(void); // Деструктор

void make_z(void);

void show(void);

};

X::X(int i)

{

x=i;

cout<<”\n Конструктор Х\n”;

}

X::~X(void)

{

cout<<”\n деструктор X\n’;

}

void X::show(void)

{

cout<<”\n x=”<<x<<endl;

}

Y::Y(int i, int j):X(i)

// конструктор класса У передает значение конструктору класса Х, поэтому

// он должен иметь два параметра

{

y=j;

cout<<”\n Конструктор Y\n”;

}

Y::~Y(void)

{

cout<<”\n деструктор Y\n’;

}

void Y::show(void)

{

cout<<”\n x=”<<x<<” y=”<<y<<endl;

}

Z::Z(int i, int j):Y(i,j)

// конструктор Z передает значения параметров конструктору Х, поэтому

// он должен иметь два параметра

{

cout<<”\n Конструктор Z\n”;

}

Z::~Z(void)

{

cout<<”\n деструктор Z\n’;

}

void Z::make_z(void)

{

z=x*y;

}

void Z::show(void)

{

cout<<z<<” = ”<<x<<” *”<<y<<endl;

}

void main(void)

{

Z zobject(3,5); // создание и инициализация объекта

zobject.make_x();

zobject.show();

zobject.X::show(); // вызов функции

zobject.Y::show(); // show из разных классов

zobject.put_x(7); // новые значения

zobject.put_y(9); // переменных x,y

zobject.make_z();

zobject.show();

zobject.X::show(); // вызов функции

zobject.Y::show(); // show из разных классов

}

Следует обратить внимание на передачу параметров конструктора производного класса конструктору базового класса

Y::Y(int i, int j):X(i) {//….}

Попытка просто изменить режим доступа при наследовании классов на private, вместо public без каких-либо других изменений, вызовет ошибку компилятора. Для того, чтобы изменить программу так, чтобы при этом режиме наследования программа работала правильно, необходимо использовать функции get_x() и get_y().

В этом примере использовалась следующая схема наследования

class X ----------- class Y -------- class Z

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