Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Технологии разработки ПО 2005.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
833.54 Кб
Скачать

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

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

class A // базовый класс

{ };

class B // базовый класс

{ };

class C : public A, public B // производный от классов А и В

{ };

В определённых ситуациях могут появиться некоторые проблемы, связанные со множественным наследованием. Допустим, что в обоих базовых классах существуют методы с одинаковыми именами, а в производном классе метода с таким именем нет. Как в этом случае объект производного класса определит, какой из методов базовых классов выбрать? Проблема решается путём использования оператора разрешения, определяющего класс, в котором находится метод.

class A {

public:

void show( ) { cout << "Класс A\n"; }

};

class B {

public:

void show( ) { cout << "Класс B\n"; }

};

class C : public A, public B {

};

///////////////////////////////////////////////////////////

int main ( ) {

C objC; // объект производного класса C

// objC.show ( ); // так делать нельзя – программа не скомпилируется

objC.A::show ( ); // так можно

objC.В::show ( ); // так можно

return 0;

}

Включение. Классы в классах

В ООП включение появляется, когда один объект является атрибутом другого объекта. Рассмотрим пример использования "включения" в классе Служащий:

class Sotrudnik {

private:

char name[L];

int number;

public:

void getdata() {

cout << "\n Vvedite FIO: "; cin.getline(name, L);

cout << " Vvedite nomer: "; cin >> number;

}

void show() const {

cout << "\n Familiya: " << name;

cout << "\n Nomer: " << number;

}

};

//---------------------------------------------------------------------------

class Worker {

private:

Sotrudnik s;

int raz;

public:

void getdata() {

s.getdata();

cout << " Vvedite razryad: "; cin >> raz;

}

void show() const {

s.show();

cout << "\n Razryad: " << raz;

}

};

//---------------------------------------------------------------------------

int main() {

Worker r1;

cout << "\nVvod workerov: "; r1.getdata();

cout << "\nVyvod workerov: "; r1.show();

getch(); return 0;

}

Д/З

На основе стандартного типа int создайте класс Int, имеющий два конструктора, метод вывода на экран и метод для перегрузки арифметической операции +. Используя общее наследование, создайте производный класс, добавляющий возможность использования операции -. Напишите программу для проверки производного класса.

Ответ

class Int {

protected:

int i;

public:

Int() { i=0; }

Int(int d) { i=d; }

void show() { cout << i; }

Int operator+(Int b) { return (i+b.i); }

};

class IntPr : public Int {

public:

IntPr() : Int() { }

IntPr(int v) : Int(v) { }

IntPr(Int a) : Int(a) { } // !!!!!!! необходимо, чтобы сработал метод базового Кл.

//IntPr operator+(IntPr ii) { return Int::operator+(ii); }

IntPr operator-(IntPr ii) { return (i-ii.i); }

};

//---------------------------------------------------------------------------

int main() {

IntPr i1(7), i2(3), res;

res = i1 + i2; cout << "Summa = "; res.show();

res = i1 - i2; cout << "\nRaznost = "; res.show();

getch(); return 0;

}

Лекция 8 (14 стр.)