With regards to the sample below, which family of structs and specific errors suffer from the Diamond Problem? The Wikipedia definition is too generic to be understood in the context of C++. In particular, virtual inheritance only solves the base class ambiguity but not function ambiguity.
struct A {void func(){}};
struct B: A {void func(){}};
struct C: A {void func(){}};
struct D: B,C {};
struct A2 {void func(){}};
struct B2: virtual A2 {void func(){}};
struct C2: virtual A2 {void func(){}};
struct D2: B2,C2 {};
struct A3 {virtual void func(){}};
struct B3: virtual A3 {void func(){}};
struct C3: virtual A3 {void func(){}};
struct D3: B3,C3 { }; // not ok: func must be overriden
struct A4 {virtual void func(){}};
struct B4: A4 {void func(){}};
struct C4: A4 {void func(){}};
struct D4: B4,C4 { }; // not ok: func must be overriden
int main()
{
A*a = new D; // not ok: ambiguous base A
A2*a2 = new D2; // ok
A3*a3 = new D3; // ok
A4*a4 = new D4; // not ok: ambiguous base A
D d;
d.func(); // not ok: ambiguous: candidates are A::func, B::func, C::func
D2 d2;
d2.func(); // not ok: ambiguous: B2::func, C2::func
D3 d3;
d3.func(); // not ok: ambiguous: B3::func, C3::func
D4 d4;
d4.func(); // not ok: ambiguous: A4::func, B4::func, C4::func
}