クラス A の定義での using 宣言により、
データ・メンバーまたはメンバー関数の名前 を、A
の基底クラスから A のスコープに導入できます。
規定および派生クラスからメンバー関数の多重定義セットを作成したい場合、 またはクラス・メンバーのアクセスを変更したい場合は、 クラス定義で using 宣言が必要です。
構文 - using 宣言 >>-using--+-+----------+--+----+--nested_name_specifier--unqualified_id--;-+->< | '-typename-' '-::-' | '-::--unqualified_id--;------------------------------------------'
クラス A の using 宣言は、次のいずれかに名前を付けます。
次の例は、このことを示しています。
struct Z { int g(); }; struct A { void f(); enum E { e }; union { int u; }; }; struct B : A { using A::f; using A::e; using A::u; // using Z::g; };
コンパイラーは、Z が A の基底クラスでないので、using 宣言 using Z::g を許可しません。
using 宣言は、テンプレートに名前を付けることはできません。 例えば、コンパイラーは、次の表記を許可しません。
struct A { template<class T> void f(T); }; struct B : A { using A::f<int>; };
using 宣言で示されている名前のインスタンスは、どれもアクセス可能でなければなりません。 次の例は、このことを示しています。
struct A { private: void f(int); public: int f(); protected: void g(); }; struct B : A { // using A::f; using A::g; };
コンパイラーは、int A::f() はアクセス可能ですが、void A::f(int) が B からアクセス不可能なので、using 宣言 using A::f を許可しません。
関連参照