在以下代码段中,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()
答案 0 :(得分:6)
可见性和访问权限检查是独立的,这意味着私有名称不会被隐藏"并且仍然可以通过名称查找找到它们,即使使用它们也会出错。
类范围中的名称查找首先查看其自己的范围,然后查看基类,然后查看封闭的范围,例如周围的命名空间范围。因此,在派生类中,查找非限定名称test
并找到Base::test
,然后在名称查找后发现它已执行访问检查,并且找到的实体是私有,所以你得到一个错误。
要引用其他test
您需要对其进行限定,因此全局test
将被称为::test
答案 1 :(得分:1)
私人是私人的。派生类无法访问其基类的私有属性。
如果您想从派生类访问test
,则需要声明它protected
。