Теоретические сведения для студентов специальностей «Экономика и организация производства», страница 26

          i=0

Описание примера приведено в комментариях к нему.

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

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

Рассмотрим пример, демонстрирующий, каким образом реализуется множественное наследование при моделировании иерархии объектов.

#include <iostream.h>

class Base_1                   //объявление базового класса Base_1

{ int a;                             // частная переменная

protected:

int b;

// защищенная переменная, имеется доступ из функций производного класса

public:

Base_1(int x,int y);          //объявление конструктор

~Base_1();             // деструктор

void show1(void)            // метод класса Base_1

{ cout << "a = " << a << "; b = " << b; } };

class Base_2                   // объявление базового класса Base_2

{protected:

int c;

//доступ к переменной только из методов собственного и производных классов

public:

Base_2(int x);                  // конструктор класса

~Base_2();             // деструктор

void show2(void) { cout << "; c = " << c << "\n"; }  //метод };

class Derive : public Base_1, public Base_2

                    //класс производный от Base_1 и Base_2.

{ int p;

public:

Derive(int X,int Y,int Z);   // конструктор

~Derive();              //деструктор

void show3(void) { cout << "a + b + c = " << p+b+c; }};

          // метод производного класса

Base_1::Base_1(int x,int y) { a=x; b=y;

cout << "\nконструктор Base_1"; }    //определение конструктора Base_1

Base_1::~Base_1() { cout << "\nдеструктор Base_1"; }

// определение деструктора Base_1

Base_2::Base_2(int x) { c=x;

cout << "\nконструктор Base_2"; }    //определение конструктора Base_2

Base_2::~Base_2()

{ cout << "\nдеструктор Base_2"; }   //определение деструктора Base_2

Derive::Derive(int X,int Y,int Z) : Base_1(X,Y), Base_2(Z)

//определение конструктора производного класса Derive

{ p=X; cout << "\nконструктор Derive\n"; }

Derive::~Derive()                      //деструктор Derive

{ cout << "\nдеструктор Derive"; }

void main(void) { Derive my_d(3,5,7);           //создание и инициализация объекта

// вызывается конструктор класса Derive, который сначала

//вызывает выполнение базовых конструкторов класса Base_1 и класса Base_2

my_d.show1();      // выполнение метода класса Base_1 для объекта my_d

my_d.show2();                // метод класса Base_2 для my_d

my_d.show3();                // метод класса Derive для my_d }

Результаты работы программы:

конструктор Base_1

конструктор Base_2

конструктор Derive

a=3; b=5; c=7

a+b+c=15

деструктор Derive

деструктор Base_2

деструктор Base_1

Отметим, что вместо частной переменной a класса Base_1 при вычислении суммы значений a+b+c используется переменная p класса Derive, доступ к которой обеспечивается из функции члена show3();. Значение 3, присваиваемое переменной a класса Base_1 и p класса Derive, выбирается из значений первого аргумента в определении объекта my_d (3,5,7) класса Derive.


Список использованных источников

1.  Шлеер С., Меллор С. Объектно-ориентированный анализ: моделирование мира в состояниях. - Киев: Диалектика, 1993.

2.  Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер. с англ. – М.: Конкорд, 1992.

3.  Cкляров В. А. Язык С++ и объектно-ориентированное программирование: Справ. издание.  - Мн.: Выш. шк, 1997.- 474 с.

4.  Лафоре Р. Объектно-ориентированное программирование в C++ .- СПб.:Питер, 2003. – 928 с.

5.  Пол И. Объектно-ориентрованное программирование с использованием С++. -Киев: ДиаСофт Лтд, 1995.