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