C++の継承

8802 ワード

継承
継承関係には、ベースクラス(親クラス)、派生クラス(子クラス)の2つのクラスがあります.
  • 派生クラスはベースクラスのすべての特徴
  • を持つ.
  • は、新しい特徴
  • を定義することができる.
  • ベースクラスのいくつかの特徴を再定義
  • 継承は単一継承とマルチ継承に分けられ、単一継承とは、1つのクラスに1つの直接ベースクラスしか存在しないことを意味し、マルチ継承とは、1つのクラスに複数の直接ベースクラスが存在することを意味します.
    class <    >: <    > <   >{
         
    	<     >
    };
    

    メンバー説明表:派生クラスで新しく定義されたメンバー継承方法:public,private,protected、デフォルトはprivateを示します.継承方法は、ベースクラスメンバーが派生クラスのどのメンバーになるかを決定します.派生クラスのオブジェクト・ユーザーおよび派生クラスの派生クラスが、その派生クラスのベースクラス・メンバーにどのようなアクセス制御を有するか.
    例:
    class bird{
         
    	public:
    		void fly(){
         cout<<"bird fly"<<endl;};//   
    		void walk(){
         cout<<"bird walk"<<endl;}//   
    };
    
    class penguin: public bird{
         
    	public:
    		void swim();//     
    		void fly(){
         cout<<"penguin can not fly"<<endl;}
    		void walk(){
         cout<<"penguin walk"<<endl;}
    };
    
    int main(){
         
    	penguin pg;
    	pg.walk();
    	pg.bird::walk(); //         bird,       bird   walk()    
    	return 0;
    }
    

    派生クラスのいくつかの規定:
  • 派生クラスは、ベースクラスのすべてのメンバー(ベースクラスのコンストラクション関数および付与オペレータリロード関数を除く)を持つほか、新しいメンバーを持つこともできます.
  • 派生クラスには、新しいメンバーが与えられてもよいし、ベースクラスのメンバーを再定義してもよい.派生クラスへのアクセスは、メンバーを再定義します.
  • 派生クラスメンバーの役割ドメインは、ベースクラスの役割ドメインにネストされています.派生クラスで同じ名前のメンバーが定義されていないベースクラスのメンバーです.このメンバー名は派生クラスの役割ドメイン内に表示されます.それ以外の場合、メンバーは派生クラスの役割ドメイン内では表示されません.使用する場合は、ベースクラス名で制限する必要があります.派生クラスにドメインベースクラスが同名でパラメータが異なるメンバー関数が定義されている場合でも、ベースクラスの同名関数は派生クラスの役割ドメインでは表示されません.
  • 派生クラスを定義する場合は、ベースクラスの定義を必ず参照してください.コンパイラは、派生クラスオブジェクトがどれだけのメモリ領域を占める必要があるか、派生クラスのベースクラスメンバーへのアクセスが合法かどうかなどを判断できません.
  • 友元関係は継承できません.明示的に指摘する必要があります.派生クラスに説明が表示されていない場合、ベースクラスの友元は派生クラスの友元ではありません.ベースクラスが別のクラスの友元であり、クラスに明示的な説明がない場合、派生クラスもそのクラスの友元ではありません.
  • 派生クラスは、ベースクラスのプライベートメンバーに直接アクセスできません.ベースクラスの非プライベートメンバー関数を使用して、ベースクラスのプライベートメンバー、すなわちpublicメンバー(外部でもアクセス可能)およびprotectedメンバー(外部ではアクセスできない)にアクセスする必要があります.
  • 継承方式の調整
    任意の継承では、ベースクラスのprivateメンバーを除いて、派生クラスでアクセス制御を個別に調整できます.
    調整方法:
    [(public:)|(protected:)|(private:)]
    <   >::<     >
    

    注意:
  • ベースクラスの1つのリロードメンバー関数名に対するアクセス制御の調整は、ベースクラスのすべてのリロード関数を調整する.
  • 派生クラスでベースクラスと同じ名前のメンバー関数が定義されている場合、派生クラスではベースクラスの同じ名前の関数へのアクセス制御調整はできません.

  • 継承方式の調整例:
    #include
    using namespace std;
    
    class bird{
         
    public:
    	void walk();
    	void fly();	
    };
    
    class penguin: public bird{
         
    private:
    	bird::fly;	
    };
    
    int main(){
         
    	penguin pg;
    	pg.fly();//error,      
    }