You need virtual inheritance to solve the diamond problem with multiple inheritance.
Not working version
struct A { int val; A() : val(42) {} }; struct B : A {}; struct C : A {}; struct D : B, C {}; // D has now A from B and C int main() { D d; // Error }
A / \ B C \ / D
Working version
struct A { int val; A() : val(42) {} }; struct B : virtual A {}; struct C : virtual A {}; struct D : B, C {}; // D now has just one A int main() { D d; // No error }
A virtual / \ virtual B C \ / D