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

どちらの場合も、で指定された1つのパブリック変数と1つのプライベート変数がaありclass Bます。


今編集しました!

4

4 に答える 4

15

どちらの場合も、クラスBにaという名前のパブリック変数とプライベート変数が1つずつあります。

いいえ、そうではありません。

最初のケースでは、同じスコープ内に同じ名前の2つの識別子を含めることはできません。2番目のケースでは、をB::a非表示A::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

2番目の例ではB::a 非表示 になっているためです。A::a引き続きアクセスできますが、同じハメを持つ親クラスのメンバーを要求していることをコンパイラーが判別するには、明示的な修飾が​​必要です。

最初の例では、両方aのスコープが同じスコープにありますが、2番目の例ではスコープが異なります。

于 2010-06-13T19:37:01.190 に答える
0

最初のものは、あいまいな定義につながるため、許可されていません。2番目では、パブリック整数変数とプライベート整数変数の両方がありますが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.
}

}

2番目の例の場合:

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++がメンバーを区別するための方法です。2番目のコードのクラスBには、「publica」と「privatea」がありません。とがB::aありA::aます。

同じ名前/署名のメンバーを異なるアクセス指定子で宣言することが許可されていたとしても、正しいメンバーに対処する方法はありません。

于 2010-06-13T19:47:04.980 に答える