继承后类无法访问

时间:2013-09-05 03:21:19

标签: c++ namespaces

如果您编译下面的代码失败,则说B类无法访问,因为它被用作成员函数func的参数。这是为什么?

注意:如果D2没有从D1继承,那么错误就会消失,所以从D2继承使得B无法访问。

namespace myns {
  class B {};
}

using namespace myns;

class D1 : B {};

class D2 : D1 {
  void func(B b) {}
};

3 个答案:

答案 0 :(得分:5)

名称查找找到D2::D1::B,而不是myns::B。在查找名称后,将执行访问检查,并发现D2::D1::B是私有的。

命名空间是一个红色的鲱鱼:如果在全局命名空间中定义B,则会观察到完全相同的结果。

答案 1 :(得分:4)

您需要添加::运算符。查找是找到注入类名而不是myns::B

class D2 : D1 {
  void func(::B b) {}
};

11.1p5

  

5 [注意:在派生类中,将查找基类名称   找到inject-class-name而不是基类的名称   声明的范围。注入类名可能是   比在其范围内的基类名称更不易访问   它被宣布了。 - 尾注]   [例如:

class A { };
class B : private A { };
class C : public B {
  A *p; // error: injected-class-name A is inaccessible
  ::A *q; // OK
};

答案 2 :(得分:0)

继承类/结构时的默认访问说明符是“私有”,所以问题是:

class D1 : B {};
class D2 : D1 {};

添加关键字“public”和瞧。

http://ideone.com/T5RpUM

namespace myns {
  class B {};
}

using namespace myns;

class D1 : public B {};

class D2 : public D1 {
  void func(B b) {}
};

int main() {
    D2 d();
}