基底クラスから派生したどのクラスのメンバーおよびフレンドも、
次のいずれかの方法を使用して、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 が入っています。 B は A から派生するので、B のメンバーは、 A の protected メンバーへのアクセスが可能です。 関数 f() は、クラス B のフレンドです。
関数 g() は、クラス B のメンバー関数です。 コンパイラーが許可するあるいは許可しないステートメントについての直前の注釈のリストは、 次の点を除き、g() にも適用できます。
関数 h() は、A の派生クラスのフレンドでもメンバーでもないので、h() は、A のどの protected メンバーにもアクセスすることはできません。
関連参照