ためになるホームページ お問い合わせ




TOP > C++ > クラスの継承(1) 継承方法
クラスの継承
C++では、あるクラスの機能を別のクラスが継承する事ができる。すなわち、「ある派生クラスがある基底クラスの機能を実装する」という事である。
クラスを継承するメリットは、共通で使用するクラスを基底クラスとし、機能が異なるところのみ、派生クラスに実装させれば記述するコード量が少なくすむ点が利点だ。
クラスを継承する時、アクセス指定子を指定する事ができる。
  • public・・・基底クラスのpublicメンバは、公開メンバとして継承する。クラス外部からアクセスする事ができる。
  • protected・・・基底クラスのメンバを非公開にしたまま、派生クラスからはアクセスできるようにする。
  • private・・・基底クラスのpublicメンバは、非公開メンバとして継承する。

  • クラスの継承と継承方法の例
    #include <iostream>
    using namespace std;
    
    class ParentC
    {
      int privateVal;
      void privateFunc(){cout << "privateVal = " << privateVal << endl;}
      void setPrivateVal(int val){privateVal = val;}
    protected:
      int protectedVal;
      void protectedFunc(){cout << "protectedVal = " << protectedVal << endl;}
      void setProtectedVal(int val){protectedVal = val;}
    public:
      int publicVal;
      void publicFunc(){cout << "publicVal = " << publicVal << endl;}
      void setPublicVal(int val){publicVal = val;}
      void accessPrivateFunc(int val)
      {
        setPrivateVal(val);
        privateFunc();
      }
    
    };
    
    class ChildPublic : public ParentC
    {
    public:
      void acceesParent(int val)
      {
        setPublicVal(val);
        publicFunc();
        setProtectedVal(val);
        protectedFunc();
        //コンパイルエラー!基底クラスがprivateの場合は、継承クラスからアクセス不可
        //setPrivateVal(val);
        //privateFunc();
      }
    };
    
    class ChileProtected : protected ParentC
    {
    public:
      void accessParent(int val)
      {
        setPublicVal(val);
        publicFunc();
        setProtectedVal(val);
        protectedFunc();
        //setPrivateVal(val);
        //privateFunc();
      }
    };
    
    class ChildPrivate : private ParentC
    {
    public:
      void accessParent(int val)
      {
        setPublicVal(val);
        publicFunc();
        setProtectedVal(val);
        protectedFunc();
        //setPrivateVal(val);
        //privateFunc();
      }
    };
    int main()
    {
      //publicで基底クラスを継承
      ChildPublic i_public;
      i_public.setPublicVal(1);
      i_public.publicVal = 1;
      i_public.publicFunc();
      //i_public.setProtectedVal(2);  //コンパイルエラー!protectedメンバは、非保護として継承
      //i_public.setPrivateVal(3);    //コンパイルエラー!privateメンバは、非保護として継承
      i_public.acceesParent(2);
      /*
       * まとめ
       * publicで基底クラスを継承すると、
       * 1.基底クラスのpublicメンバが外部からアクセスできる
       * 2.基底クラスのprotectedメンバは外部からアクセスできない。(非公開となるため)
       *   但し、継承クラス内からは、基底クラスのprotectedメンバにはアクセスできる。
       * 3.基底クラスのprivateメンバは外部からアクセスできないし、継承クラスの内部から
       *   もアクセスできない。
       */
    
      //protectedで基底クラスを継承
      ChileProtected i_protected;
      //コンパイルエラー!protectedで継承したメンバは全て非公開になる。
      //i_protected.setPublicVal(1); 
      //i_protected.setProtectedVal(2);
      //i_protected.setPrivateVal(3);
      i_protected.accessParent(2);
    
      /*
       * まとめ
       * protectedで基底クラスを継承すると、
       * 1.基底クラスの全てのメンバは外部からアクセスできない。
       * 2.継承クラス内部からは、基底クラスのメンバにアクセスできる。
       *
       */
    
      //privateで基底クラスを継承
      ChildPrivate i_private;
      //i_private.setPublicVal(1);
      //i_private.setProtectedVal(2);
      //i_private.setPrivateVal(3);
      i_private.accessParent(3);
      
      /*
       * まとめ
       * privateで基底クラスを継承すると、
       * 全ての基底クラスのメンバは、継承クラスでは非公開となる。
       *
       */
      return 0;
    }
    
    
    


    
    






    Copyright 2007 ためになるホームページ All Rights Reserved.