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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.