クラス A の定義での using 宣言により、 データ・メンバーまたはメンバー関数の名前 を、A の基底クラスから 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 を許可しません。struct A {
template<class T> void f(T);
};
struct B : A {
using A::f<int>;
};
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 を許可しません。