基本クラス,派生クラスのアクセス

提供: Appmethod Topics
移動先: 案内検索

メンバーのスコープ:インデックス への移動

派生クラス D を宣言するときには,カンマで区切られた基本型リスト内に基本クラス B1,B2,... をリストします。



 クラスキーワード D: 基本型リスト{< メンバーリスト >}



D は,これらの基本クラスのすべてのメンバーを継承します (再定義された基本クラスメンバーも継承されており,必要な場合はスコープオーバーライドを用いてアクセスできます)。D は,基本クラスの public メンバーと protected メンバーのみを使用できます。しかし,D から見た場合の継承メンバーのアクセス属性はどうなるのでしょうか。D としては,基本型のある public メンバーを使いたいが,関連する関数の外部に対してはそのメンバーを private にしたいという場合があります。これを解決するには,基本型リスト内でアクセス指定子を使用することになります。

メモ:  基本クラス自身が派生クラスになり得るので,アクセス属性の問題は再帰的なものです。何も継承していない基本クラスのおおもとに達するまで,同じ道をたどって戻ります。

D を宣言しているとき,基本型リスト内のクラスの前にアクセス指定子 publicprotected,または private を付けることができます。



 class D : public B1, private B2, ... {
   .
   .
   .
 }



これらの修飾子は,派生クラスから見た場合の基本メンバーのアクセス属性を変更することができますが,基本クラスから見たときの基本メンバーのアクセス属性は変更しません。

D が class 宣言であればデフォルトは private であり,D が struct 宣言であればデフォルトは public です。

メモ:  共用体は基本クラスを持つことができず,また共用体を基本クラスとして使うこともできません。

派生クラスは,次のように基本クラスからアクセス属性を受け継ぎます。

  • public 基本クラス: 基本クラスの public メンバーは,派生クラスの public メンバーになる。基本クラスの protected メンバーは,派生クラスの protected メンバーになる。基本クラスの private メンバーは,基本クラスに対して private のまま。
  • protected 基本クラス: 基本クラスの public および protected メンバーは,ともに派生クラスの protected メンバーになる。基本クラスの private メンバーは,基本クラスに対して private のまま。
  • private 基本クラス: 基本クラスの public および protected メンバーは,ともに派生クラスの private メンバーになる。基本クラスの private メンバーは,基本クラスに対して private のまま。

基本クラスの private メンバーは,基本クラス内でアクセスを認める friend 宣言が明示的に行われていない限り,派生クラスのメンバー関数からは絶対にアクセスできないことに注意してください。次に例を示します。



 /* class X は class A から派生 */
 class X : A {               // クラスのデフォルトは private A
   .
   .
   .
 }
 /* クラス Y は B と C から派生(多重継承)
    B はデフォルトで private B */
 class Y : B, public C {     // C のデフォルトを変更する
   .
   .
   .
 }
 /* struct S は D から派生 */
 struct S : D {              // struct のデフォルトは public D
   .
   .
   .
 }
 /* struct T は D と E から派生(多重継承)
    E はデフォルトで public E */
 struct T : private D, E {   // D のデフォルトを変更
                             // E はデフォルトで public
   .
   .
   .
 }



基本型リスト内のアクセス指定子の効果は,派生クラスの public または protected 宣言の中で限定名を使って調整できます。次に例を示します。



 class B {
    int a;               // private がデフォルト
 public:
    int b, c;
    int Bfunc(void);
 };
 class X : private B {   // a,b,c,Bfunc は X 内では private
    int d;               // private がデフォルト
                         // a には X 内ではアクセスできない
 public:
    B::c;                // c は private だったが,ここでは public
    int e;
    int Xfunc(void);
 };
 int Efunc(X& x);        // B および X に対しては外部



関数 Efunc は,public 名 c,e,と Xfunc() だけを使用できます。

関数 Xfunc() は,private B から派生した X 内にあり,したがって以下へのアクセスを持ちます。

  • 「パブリックに調整された」c
  • B からの「X にプライベート」なメンバーである b と Bfunc()
  • X 自身のプライベートおよびパブリックメンバーである d,e,および Xfunc()

しかし,Xfunc() は「B にプライベート」であるメンバー a にアクセスすることはできません。

関連項目