Diamond problem — ambiguous inheritance path in multiple inheritance.
1class A { public: int value; };2class B : public A {};3class C : public A {};4class D : public B, public C {};56D d;7// d.B::value and d.C::value — ambiguous!8// d.value — Error: ambiguous910// Solution: virtual inheritance11class A2 { public: int value; };12class B2 : virtual public A2 {};13class C2 : virtual public A2 {};14class D2 : public B2, public C2 {};1516D2 d2;17d2.value = 10; // OK — single A2 base1819// Virtual base constructed by most derived class20class D3 : public B2, public C2 {21public:22 D3() : A2() {} // Constructs A2 directly23};
Issues with virtual inheritance: