Множественное наследование в ООП – это наследование от двух и более базовых классов, возможно, с различным уровнем доступа (нет никаких ограничений на количество). При множественном наследовании конструкторы базовых классов вызываются в порядке перечисления имен классов в списке базовых классов. Порядок вызова деструкторов ему прямо противоположен.
class Derived : public BaseA, protected BaseB, private BaseC {
// ...
};
При множественном наследовании возможна ситуация неоднократного включения подобъекта одного и того же базового класса в состав производного. Связанные с нею проблемы и неоднозначности снимает виртуальное наследование. Решение – включение в состав класса единственного разделяемого подобъекта (виртуального базового класса).
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 { };
В большинстве случаев можно избежать использования множественного наследования или сделать его максимально безопасным. Выбирая множественное наследование убедитесь, что оно вам действительно нужно