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

C++ 继承层次结构中的成员访问权-C++;,c++,inheritance,scope,C++,Inheritance,Scope,资料来源: 在上述代码中,obj_F.z=10-是允许的。 说明:成员z的访问权限仍然是公共的。使用A::z的private using声明对z的访问没有影响 有人能告诉我,如果被声明为私有的z在外部是可访问的,那么私有的含义是什么?它有什么作用 谢谢 -SaiyasodharanF私自继承了一项遗产。因此,如果在F的定义之外使用F,则无法访问A的任何公共成员。因为F不定义成员,所以F基本上是无用的 如果F公开继承A(即:) 然后您现在可以使用A的公共成员。所以你可以写obj_F.z 如果变量z

资料来源:

在上述代码中,obj_F.z=10-是允许的。 说明:成员z的访问权限仍然是公共的。使用A::z的private using声明对z的访问没有影响

有人能告诉我,如果被声明为私有的z在外部是可访问的,那么私有的含义是什么?它有什么作用

谢谢


-Saiyasodharan

F私自继承了一项遗产。因此,如果在F的定义之外使用F,则无法访问A的任何公共成员。因为F不定义成员,所以F基本上是无用的

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

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

如果变量z在a中为公共变量,在F中为私有变量,即:

struct F : public A {};
那么这两个z实际上是两个不同的变量。那不是你想要的

另外,正如Andre Holzner所说,您的using语句在这里是无用的


通常,在任何对象编程语言中,都不能限制公共继承子类中成员的范围。要么类定义无法编译,要么不遵守,要么将创建另一个同名成员。这是因为您的F与处理a或其子类的代码不兼容。

根据标准,该代码是有效的-请参阅此标准规则,我在回答之前没有想到这一点

在类N中命名时,如果

  • […]或
  • 存在一个N的基类B,它可以在引用点访问,而m可以在 以B类命名
这完全适用于您的代码,因此访问是有效的。。。此规则的主要目的似乎是允许基的友元声明应用于继承的成员,但它也适用于这种情况


(忽略本部分中表示代码无效的部分-如上所述,它是有效的。本部分是我答案的旧版本,保留在此处作为背景信息)

否,此代码无效。这就是等效的“访问声明”被这样调用的原因(尽管这些声明已被弃用)


这些被称为“访问声明”,正是因为它们可以更改访问。。。在您的示例中,命名类是
F
,而
z
作为
F
的成员是私有的,因为using声明确实更改了名称
z
的访问级别。错误C2248:“F::z”:无法访问g++中类“F”中声明的私有成员:错误:“int a::z”在VC++10中是不可访问的相同错误。。虽然根据标准它是正确的,但在MS VC++中它是不正确的,它似乎继承了一个私有的-这是我的荣幸
F
A
是结构(不是类)。我不知道为什么查尔斯删除了他的答案(尽管他的答案的第一段和最后一段是正确的)<代码>根据标准,该代码是有效的。什么使代码有效?它仍然是不完整的。这与代码的有效性不同吗?@prason代码是有效的-请参阅我从标准中引用的文本。我只是测试了各种编译器,看看它们如何符合这种奇怪的特性,对我来说,只有科莫接受它。我向clang发送了一份PR:@查尔斯也很好地绕过了它,他说,
obj_F.a::z
@Johannes:我看到了引用的文本,非常有意义。这是否意味着这是像GCC/CLAN/MSVC++那样的编译器中的一个bug?@ Prason很好,这取决于我们认为什么是bug。如果我们要严格按照标准来实现一切,我们就不能建立一个工作/有用的编译器,因为标准是无效的。如果我们说他们有一个错误,如果他们反对委员会的意图(这是实际做的),我们将首先必须等待委员会的声明:)是的,谢谢你报告这个错误。实际上,从你的帖子
来看,根据标准,代码是有效的
否,此代码无效
说了两件不同的事情。
struct F : public A {};
struct A { public: int z; };
struct F : public A { private: int z; };
struct F : A {
public:
  A::y;
private:
  A::z;
};