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

Множественное наследование

Язык С++ позволяет наследование не только от одного, а одновременно от нескольких классов. Форма наследования следующая:

class имя-производного-класса:список базовых классов {

// ……..

};

Список базовых классов содержит перечисленные базовые классы с соответствующими режимами доступа к каждому из базовых классов. Пример

class Z:public U, public V, protected W {// …. };

рассмотрим предыдущий пример с множественным наследованием, когда классы X и Y равноправны.

#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 {

protected:

int y;

public:

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

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

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

int get_y(void) { return y;}

void show(void);

};

class Z: public X, 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)

{

y=j;

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

}

Y::~Y(void)

{

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

}

void Y::show(void)

{

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

}

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

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

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

{

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 из разных классов

}

Замечание

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

конструктор-производного-класса(список аргументов):

базовый-класс1(список аргументов),

базовый-класс2(список аргументов),

базовый-классN(список аргументов)

{

}

Базовый-классI – имя конструктора базового класса, который наследуется производным классом

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