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
答案 0 :(得分:3)
代码根据标准有效 - 请参阅此标准规则,我在之前回答时没有想到
如果
,则在N类中命名时可以访问成员m
- [...]或
- 存在可在参考点访问的N的基类B,并且可以访问m 在B级中命名。
这完全适用于您的代码,因此访问权限有效......此规则的主要目的似乎是允许基础的朋友声明应用于继承的成员,但它也适用于此情况。
(忽略这段代码无效的部分 - 如上所述,这是有效的。这部分是我的答案的旧版本,保留在这里作为背景信息)
不,此代码无效。这就是为什么以这种方式调用等效的“访问声明”(虽然这些已被弃用)
struct F : A {
public:
A::y;
private:
A::z;
};
这些被称为“访问声明”正是,因为他们可以更改访问权限...在您的示例中,命名类是F
和z
作为成员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或其子类的代码不兼容。