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

Язык C++ / Множественное наследование

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

class X
{...};
class Y
{...};
class Z
{...};
class A : public X, public Y, public Z
{...};

Класс А обобщенно наследует элементы всех трех основных классов.
Множественное наследование
Для доступа к членам порожденного класса, унаследованного от нескольких базовых классов, используются те же правила, что и при порождении из одного базового класса. Проблемы могут возникнуть в следующих случаях:

  • если в порожденном классе используется член с таким же именем, как в одном из базовых классов;
  • когда в нескольких базовых классах определены члены с одинаковыми именами.

В этих случаях необходимо использовать оператор разрешения контекста для уточнения элемента, к которому осуществляется доступ, именем базового класса.

class X
{int key;};
class Y
{int key;};
class Z
{int key;};
class A : public X, public Y, public Z
{int key;
...............
key=X :: key + Y :: key + Z :: key;
...............
};

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

  • конструкторы базовых классов в порядке их задания;
  • конструкторы членов, являющихся объектами класса;
  • конструктор порожденного класса.

Деструкторы вызываются в порядке обратном вызову конструкторов.

Пример

#include <iostream>
using namespace std;
class X {
protected:
  int key;
public:
  X (int i=0) {cout << "X constructor" << endl; key = i;};
  ~X() {cout << "X destroyed" << endl; cin.get();};
};
class Y {
protected:
  int key;
public:
  Y (int i=0) {cout << "Y constructor" << endl; key = i;};
  ~Y() {cout << "Y destroyed" << endl; cin.get();};
};
class Z {
protected:
  int key;
public:
  Z (int i=0) {cout << "Z constructor" << endl; key = i;};
  ~Z() {cout << "Z destroyed" << endl; cin.get();};
};
class A : public X, public Y, public Z {
  int key;
public:
  A(int i=0) : X(i+1), Y(i+2), Z(i+3)
    { key = X::key + Y::key + Z::key; }
  int getkey(void) {return(key);}
};
int main() {
  A object(4);
  cout << "object.key = " << object.getkey();
  cin.get();
  return 0;
}

Результат выполнения
Результат множественного наследования
Назад

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *