printНаследование

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

При множественном наследовании класс наследует структуру и поведение от нескольких классов.

При множественном наследовании могут появиться следующие проблемы:

1.Наследование от общего предка. В этом случае используют виртуальные классы.
class A {};
class B: virtual public A {};
class C: virtual public A {};
class D: public B, public C {};
При использовании виртуальных классов конструкторы выполняются в специальном порядке: сначала конструкторы всех виртуальных классов, а потом конструкторы базовых классов и полей в обычном порядке и тело конструктора. Для деструкторов порядок строго противоположный.

2. Методы с одинаковой сигнатурой в разных базовых классах. В этом случае используют явное указание имени класса перед именем метода при вызове.
class A { 
public:
  void f();
};
class B { 
public:
  void f();
};
class C: public A, public B {};
int main()
{ C c1;
  c1.A::f(); // метод из класса A
  c1.B::f(); // метод из класса B
}

3. Переопределение виртуальных методов с одинаковой сигнатурой в разных базовых классах. В этом случае вводят промежуточные классы.
class A { 
public:
  virtual void f();
};
class B { 
public:
  virtual void f();
};
class A1: public A { 
public:
  virtual void fA() { A::f(); }
  void f() final { fA(); }
};
class B1: public B { 
public:
  virtual void fB() { B::f(); }
  void f() final { fB(); }
};
class C: public A1, public B1 
{
  void fA() override;
  void fB() override;
};
loading