C ++多重继承私有成员的ambigious访问

时间:2017-02-12 16:46:38

标签: c++ multiple-inheritance access-control private-members name-lookup

以下代码:

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'

但为什么呢? M只能看到A1::xA2::x应该是纯粹的本地化。

1 个答案:

答案 0 :(得分:3)

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

您可以使用限定名称来消除歧义:

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