1

下面的代码:C++多重继承私有成员ambigious访问

class A1 { 
public: 
    int x; 
}; 
class A2 { 
private: 
    int x() { return 67; } 
}; 

class M : public A1, public A2 {}; 

int main() { 
    M m; 
    m.x; 
} 

编译错误:

error C2385: ambiguous access of 'x' 
note: could be the 'x' in base 'A1' 
note: or could be the 'x' in base 'A2' 

但是,为什么?只有A1::x应可见M. A2::x应该是纯粹的本地。

+1

在C++中,*名称查找*发生之前*进行成员访问检查*。 – WhiZTiM

+0

您之前提出的问题: http://stackoverflow.com/questions/6397938/ambiguous-access –

回答

3

在C++中,name-lookup发生在执行member access checking之前。因此,名称查找(在您的情况下不合格)会找到两个名称,这是不明确的。

您可以使用一个合格的名称来消除歧义:

int main() { 
    M m; 
    m.A1::x;  //qualifed name-lookup 
} 
+0

@ tower120,no。这与ADL无关。 [Koenig Lookup](http://en.cppreference.com/w/cpp/language/adl)在对非成员函数进行非限定查找时发挥作用 – WhiZTiM

+0

顺便说一句,这是历史性的,还是由设计(为某事)?对我来说,起初,这看起来像一个编译器错误,但现在它看起来像一个语言错误:) – tower120

+1

不,它不是一个语言错误。这是您希望访问控制影响名称查找的问题。如果访问控制受到影响的名称查找(例如,改变了可以接受的匹配项),那么只需简单地将'private'改为'public'或者将'private'改为'public',就可以很容易地(有意或无意地)以意想不到的方式显着改变工作代码的行为,或者反之亦然。更好地提醒程序员含糊不清(正如你所发生的那样),而不是让代码在小的变化面前变得脆弱。 – Peter