【问题标题】:C++ inheritance: scoping and visibility of membersC++ 继承:成员的范围和可见性
【发布时间】:2011-03-03 07:02:12
【问题描述】:

你能解释一下为什么不允许这样做吗?

#include <stdio.h>

class B {
private:
    int a;
public:
    int a;
};

int main() {
    return 0;
}

这是?

#include <stdio.h>

class A {
public:
    int a;
};

class B : public A{
private:
    int a;
};

int main() {
    return 0;
}

在这两种情况下,class B 中都有一个名为 a 的公共变量和一个私有变量。


已编辑!

【问题讨论】:

  • @Neil:你的意思是第二个声明了 A 类?
  • @Alan 是的 - 我对这个问题感到非常困惑,我有点困惑:-)
  • 为什么会有反对票?这是一个合理的问题,我记得在学习 C++ 课程时也想知道同样的事情......
  • 这似乎更像是一个问题而不是一个疑问。你对 C++ 的继承缺乏信心吗?
  • @incrediman 在 OP 编辑​​之前,对这个问题投了反对票,完全改变了它的意义。

标签: c++ class inheritance redeclaration


【解决方案1】:

不允许使用第一个,因为它会导致定义不明确。在第二个中,虽然您确实有一个公共和一个私有 a 整数变量,但您在 B 类中隐藏了 A::a 。编译器隐含地知道您想要什么,因为有一种方法可以显式访问隐藏变量。

我也相信它归结为名称修改:存储说明符最终不会成为实际名称的一部分。然而,我可能错了。

说明为什么一个允许而另一个不允许的最简单方法是查看编译器如何编译使用每个变量的成员函数。

在你的班里:

class b {

int a;
public:
int a;

void myMethod()
{
 a = 10; //what a should the compiler use? Ambiguous, so the compiler sez BZZT.
}

}

第二个例子:

class A
{
public: 
int a;
}

class B: public A
{
private:
int a;

void someMethod()
{
 a = 10; //implied that you are using B::a (which may be a programmer error)

}

}

【讨论】:

    【解决方案2】:

    因为B::a 隐藏 A::a 在第二个例子中。您仍然可以访问它,但编译器需要明确限定才能确定您正在请求具有相同 hame 的父类成员。

    在第一个示例中,两个a 都在同一个范围内,而在第二个示例中,范围不同。

    【讨论】:

      【解决方案3】:

      在这两种情况下,我们都有一个公共 和一个名为 a in 的私有变量 B类。

      不,那不是真的。

      在第一种情况下,您不能在同一范围内拥有两个同名的标识符。而在第二种情况下,B::a 隐藏了A::a,并且要访问A::a,您必须完全限定名称:

      b.a = 10; // Error. You can't access a private member.
      b.A::a = 10; // OK.
      

      【讨论】:

        【解决方案4】:

        第一个示例中的 B 类无效,因为 C++ 无法通过访问说明符(公共/私有/受保护)来区分成员。但是,命名空间是 C++ 区分成员的一种方式。在第二个代码的 B 类中,您没有“公共 a”和“私有 a”,而是有 B::aA::a

        即使允许使用不同的访问说明符声明具有相同名称/签名的成员,也无法寻址正确的成员。

        【讨论】:

          猜你喜欢
          • 2012-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-06
          • 2012-10-14
          • 1970-01-01
          • 1970-01-01
          • 2017-04-29
          相关资源
          最近更新 更多