【问题标题】:C++ multiple inheritance private member ambigious accessC++多继承私有成员不明确访问
【发布时间】:2017-02-12 16:46:37
【问题描述】:

以下代码:

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 应该是纯本地的。

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • @tower120,没有。这与 ADL 无关。 Koenig Lookup 在对非成员函数进行非限定查找时发挥作用
  • 顺便说一句,这是历史的东西,还是设计(为了某事)?对我来说,起初,这看起来像一个编译器错误,但现在它看起来像一个语言错误:)
  • 不,这不是语言错误。这是您期望访问控制影响名称查找的问题。如果访问控制影响了名称查找(例如更改了可接受的匹配项),那么只需将 private 更改为 public 或反之亦然。最好提醒程序员注意模棱两可(就像你发生的那样),而不是让代码在面对微小的变化时变得脆弱。
  • 这是虚假的论点。更改访问级别不是“小改动”,当确实存在错误时,您会得到预期的错误。同样的问题会影响简单的类继承。它破坏了类封装逻辑,因为你在基类中定义了一个私有成员,而派生类不能再随意使用该名称。
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多