using 宣言およびクラス・メンバー (C++ のみ)

クラス A の定義での using 宣言により、 データ・メンバーまたはメンバー関数の名前 を、A の基底クラスから A のスコープに導入できます。

基底クラスおよび派生クラスからメンバー関数のセットを作成したい場合、 またはクラス・メンバーのアクセスを変更したい場合は、 クラス定義で using 宣言が必要です。

構文図を読む構文図をスキップする
using 宣言の構文 

>>-using--+-+----------+--+----+--nested_name_specifier--unqualified_id--;-+-><
          | '-typename-'  '-::-'                                           |   
          '-::--unqualified_id--;------------------------------------------'   

クラス Ausing 宣言は、次のオプションのいずれかに名前を付けることがあります。
  • A の基底クラスのメンバー
  • A の基底クラスのメンバーである無名共用体のメンバー
  • A の基底クラスのメンバーである列挙型の列挙子
次の例は、このことを示しています。
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;
};
コンパイラーは、ZA の基底クラスでないので、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 を許可しません。