关于继承:死亡钻石和范围解析算子(c ++)

Diamond of death and Scope resolution operator (c++)

本问题已经有最佳答案,请猛点这里访问。

考虑下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>

using namespace std;

// helpers
void disp1(string s, int i, void* p) { cout << s <<" constructed with" << i <<" @" << p <<"
"
; }
void disp2(string s, void* p)        { cout << s <<" @" << p <<"
"
; }

// class hierarchy:
//
//      A   A
//      |   |
//      B   C
//       \ /
//        D
//
struct A        { A() { disp1("A", 0, this); } void tell() { disp2("A", this); } };
struct B : A    { B() { disp1("B", 0, this); } void tell() { disp2("B", this); } };
struct C : A    { C() { disp1("C", 0, this); } void tell() { disp2("C", this); } };
struct D : B, C { D() { disp1("D", 0, this); } void tell() { disp2("D", this); } };

int main()
{
    D d;
    static_cast<B*>(&d)->A::tell();  // OK: call B::A::tell()
    static_cast<C*>(&d)->A::tell();  // OK: call C::A::tell()
//  d.B::A::tell();                  // compile error: 'A' is an ambiguous base of 'D'

}

为什么我得到错误的呼叫,如d.B::A::tell();在线合格吗?它真的是一D基地A解距离模糊,但为什么它是相关的?

我已经明确说"呼叫tell()of AB)"。解距离模糊的"这是什么?