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' } |
为什么我得到错误的呼叫,如
我已经明确说"呼叫