【问题标题】:C++ : Accessing private member of base or global variable from a derived classC++:从派生类访问基变量或全局变量的私有成员
【发布时间】:2014-11-17 14:56:24
【问题描述】:

在以下代码中,sn -p check() 无法访问名为 test 的变量:

int test; //global variable
class Base {
private:
    int test; //private member of Base
public: 
    void getit() {
         cin>>test;
    }
};

class Derived: public Base {
public:
    void check(){ 
        test ++; //Increments neither global variable nor private member of Base
    }
}

我在这里缺少范围呢? check() 不应该至少可以访问全局变量吗?

【问题讨论】:

  • check范围内,不带前缀的test指的是Base::test,因为它是私有的,所以不能访问。如果要增加全局变量,请改用::test

标签: c++ class inheritance c++11


【解决方案1】:

可见性和访问检查是独立的,这意味着私有名称不是“不可见的”,它们仍然可以通过名称查找找到,即使使用它们会出错。

类范围内的名称查找将首先在其自身范围内查找,然后在基类中查找,然后在封闭范围内查找,例如周围的命名空间范围。所以在派生类中查找不合格名称test 并找到Base::test,然后名称查找发现它执行访问检查后,找到的实体是私有的,所以你得到一个错误。

要引用不同的test,您需要对其进行限定,因此全局test 将被称为::test

【讨论】:

    【解决方案2】:

    私人是私人的。派生类无法访问其基类的私有属性。

    如果要从派生类访问test,则需要将其声明为protected

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多