【发布时间】:2020-01-21 06:50:02
【问题描述】:
关于下面的示例,哪些结构族和特定错误会受到钻石问题的影响? Wikipedia 的定义过于笼统,无法在 C++ 的上下文中理解。 特别是,虚拟继承只解决了基类的歧义,而没有解决函数的歧义。
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
}
【问题讨论】:
标签: c++