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

Множественное наследование в ООП – это наследование от двух и более базовых классов, возможно, с различным уровнем доступа (нет никаких ограничений на количество). При множественном наследовании конструкторы базовых классов вызываются в порядке перечисления имен классов в списке базовых классов. Порядок вызова деструкторов ему прямо противоположен.

class Derived : public BaseA, protected BaseB, private BaseC {
 	// ...
 };

Виратуальное наследование

При множественном наследовании возможна ситуация неоднократного включения подобъекта одного и того же базового класса в состав производного. Связанные с нею проблемы и неоднозначности снимает виртуальное наследование. Решение – включение в состав класса единственного разделяемого подобъекта (виртуального базового класса).

classDiagram A <|-- B1 A <|-- B2 B1 <|-- C B2 <|-- C
struct A { };
struct B1 : A { };
struct B2 : A { };
struct C : B1, B2 { }; // проблема. Класс A представлен дважды

Решить это можно с помощью виртуального наследование, которое будет гарантировать, что в конечном экземпляре будет по одному объекту базового в случае их получения по одной из ветвей наследования:

struct A { };
struct B1 : virtual A { };
struct B2 : virtual A { };
struct C : B1, B2 { };

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