クラス名または列挙名がスコープ内にあって、隠蔽されていなければ、それは可視です。
クラス名または列挙名は、その同じ名前を (オブジェクト、関数、または列挙子として)
ネストされた宣言領域または派生クラスの中で明示的に宣言することによって、隠蔽できます。
クラス名または列挙名は、オブジェクト、関数、または列挙子の名前が可視である場所では、
どこでも隠蔽されます。
このプロセスは、名前の隠蔽 と呼ばれています。
メンバー関数定義内で、ローカル名を宣言すると、同じ名前のクラスのメンバーの宣言を隠蔽します。 派生クラス内でメンバーを宣言すると、同じ名前の基底クラスのメンバーの宣言を隠蔽します。
名前 x が、ネーム・スペース A のメンバーであると想定します。 また、ネーム・スペース A のメンバーは、ネーム・スペース B で可視であると想定します (using の宣言のために)。 ネーム・スペース B 内で x という名前のオブジェクトを宣言すると、A::x は隠蔽されます。このことを以下の例で示します。
#include <iostream> #include <typeinfo> using namespace std; namespace A { char x; }; namespace B { using namespace A; int x; }; int main() { cout << typeid(B::x).name() << endl; }
次に、上記の例の出力を示します。
int
ネーム・スペース B 内での整数 x の宣言は、 using 宣言によって導入された文字 x を隠蔽します。
関連参照