Множественное наследование
При множественном наследовании класс наследует структуру и поведение от нескольких классов.
При множественном наследовании могут появиться следующие проблемы:
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(); //
c1.B::f(); //
}
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;
};