protected メンバー

C++基底クラスから派生したどのクラスのメンバーおよびフレンドも、 次のいずれかの方法を使用して、protected 非静的基底クラス・メンバーにアクセスすることができます。

基底クラスから private にクラスを派生させた場合、 基底クラスの全 protected メンバーは、派生クラスの private メンバーになります。

派生クラス B のフレンドまたはメンバー関数で、 基底クラスの A の protected 非静的メンバー x を参照する場合、A から派生したクラスに対するポインター、参照、またはオブジェクトを介して x にアクセスする必要があります。 しかし、x にアクセスし、メンバーに対するポインターを作成している場合は、 派生クラス B の名前を付けるネスト名前指定子で x を修飾する必要があります。

class A {
public:
protected:
  int i;
};
 
 
class B : public A {
  friend void f(A*, B*);
  void g(A*);
};
 
void f(A* pa, B* pb) {
//  pa->i = 1;
  pb->i = 2;
 
//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}
 
void B::g(A* pa) {
//  pa->i = 1;
  i = 2;
 
//  int A::* point_i = &A::i;
  int A::* point_i2 = &B::i;
}
 
void h(A* pa, B* pb) {
//  pa->i = 1;
//  pb->i = 2;
}
 
int main() { }

クラス A には、protected データ・メンバーである、整数 i が入っています。 BA から派生するので、B のメンバーは、 A の protected メンバーへのアクセスが可能です。 関数 f() は、クラス B のフレンドです。

関数 g() は、クラス B のメンバー関数です。 コンパイラーが許可するあるいは許可しないステートメントについての直前の注釈のリストは、 次の点を除き、g() にも適用できます。

関数 h() は、A の派生クラスのフレンドでもメンバーでもないので、h() は、A のどの protected メンバーにもアクセスすることはできません。

関連参照

IBM Copyright 2003