继承层次结构中的成员访问权限 - C ++

时间:2010-09-18 11:27:17

标签: c++ inheritance scope

struct A {
protected:
  int y;
public:
  int z;
};

struct F : A {
public:
  using A::y;
private:
  using A::z;
};

int main() {
  F obj_F;
  obj_F.y = 9;
  obj_F.z = 10;
}

来源: http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc14cplr135.htm

在上面的代码 obj_F.z = 10; - 是允许的。 说明:成员z的访问权限仍然是公开的。使用A :: z的私有使用声明对z的访问没有影响。

有人可以告诉我,如果z被声明为私有,可以在外面访问,那么私有的含义是什么?它做了什么?

由于

-Saiyasodharan

2 个答案:

答案 0 :(得分:3)

代码根据标准有效 - 请参阅此标准规则,我在之前回答时没有想到

  

如果

,则在N类中命名时可以访问成员m      
      
  • [...]或
  •   
  • 存在可在参考点访问的N的基类B,并且可以访问m   在B级中命名。
  •   

这完全适用于您的代码,因此访问权限有效......此规则的主要目的似乎是允许基础的朋友声明应用于继承的成员,但它也适用于此情况。


(忽略这段代码无效的部分 - 如上所述,这是有效的。这部分是我的答案的旧版本,保留在这里作为背景信息)

不,此代码无效。这就是为什么以这种方式调用等效的“访问声明”(虽然这些已被弃用)

struct F : A {
public:
  A::y;
private:
  A::z;
};

这些被称为“访问声明”正是,因为他们可以更改访问权限...在您的示例中,命名类是Fz作为成员F是私有的,因为using声明 更改了名称z的访问级别。

答案 1 :(得分:-2)

F私下继承A.因此,如果使用F外部F的定义,则无法访问任何A的公共成员。因为F没有定义成员,所以F基本没用。

如果F公开继承A(即:)

struct F : public A {};

然后您现在可以使用A的公共成员。所以你可以写obj_F.z

如果你有一个变量z在a中是公共的,在F中是私有的,即:

struct A { public: int z; };
struct F : public A { private: int z; };

那么两个z实际上是两个不同的变量。那不是你想要的。

另外,就像Andre Holzner所说,你的使用声明在这里没用。

通常,您不能在任何对象编程语言中限制公共继承子类中成员的范围。类定义不会编译,也不会服从,或者将创建具有相同名称的另一个成员。这是因为您的F与处理A或其子类的代码不兼容。