5

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

#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;
}

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


现在编辑!

4

4 回答 4

15

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

不,那不是真的。

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

b.a = 10; // Error. You can't access a private member.
b.A::a = 10; // OK.
于 2010-06-13T19:38:45.700 回答
3

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

在第一个示例中,两者a的范围相同,而在第二个示例中,范围不同。

于 2010-06-13T19:37:01.190 回答
0

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

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

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

在你的 b 类里面:

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)

}

}
于 2010-06-13T19:36:47.913 回答
0

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

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

于 2010-06-13T19:47:04.980 回答