C++における継承関係の概要

2392 ワード

継承
単一継承
class SubClass:[    ]ParentClass
{
//variables
};

サブクラスメンバーのベースクラスメンバーへのアクセス方法:継承方法
サブクラスメンバーのベースクラスメンバーへのアクセス方式の制限は継承方式によって決定され、
class A {
public: 
         x;
protected:
         y;
private:
         z;
};

class B:[public/protected/private]A{

};

継承方式
ベースクラスメンバー
サブクラスメンバーのアクセス
サブクラスのメンバー関数
サブクラスのオブジェクト
public
public protected private
public protectedアクセス不可
ベースクラスのpublicおよびprotectedメンバーにアクセスできます
ベースクラスのpublicおよびprotectedメンバーにアクセスできます
protected
public protected private
protected protectedアクセス不可
ベースクラスのpublicおよびprotectedメンバーにアクセスできます
ベースクラスのすべてのメンバーにアクセスできません
private
public protected private
private privateアクセス不可
ベースクラスのpublicおよびprotectedメンバーにアクセスできます
ベースクラスのすべてのメンバーにアクセスできません
public継承方式
子クラスが親クラスをpublicで継承する場合、親クラスのメンバーのプロパティは子クラスで変更されません.親クラスのprivateメンバーはプライベートメンバーであり、サブクラスにはアクセスできません.
protected継承
子クラスが親クラスをprotectedで継承する場合、親クラスのpublic/protectedメンバーは子クラスのprivateメンバーに相当します.親クラスのprivateメンバーはプライベートメンバーであり、サブクラスにはアクセスできません.
private継承
子クラスが親クラスをprivateで継承する場合、親クラスのpublic/protectedメンバーは子クラスのprivateメンバーに相当します.親クラスのprivateメンバーはプライベートメンバーであり、サブクラスにはアクセスできません.
サブクラスのコンストラクション関数
class A
{
public: 
       A(int m) {num=m;};
private:
      int num;
};

class SubClass: public A {
public:
        SubClass(int a, string s):A(a) {
                  s = s;
        }
private:
        string s;
};
SubClassのコンストラクタを初期化するには、親Aのコンストラクタを初期化してから、ベースクラスのコンストラクタを初期化します.
マルチ継承
class A {
public:
        A(B b){
       }
};

Class B {
};
Class C: public A{
public:
         C(B b):A(b), b(b) {
         }
private:
          B b;
};
マルチ継承の場合、親とメンバーの初期化は次のルールに従います.
1.ベースクラスは継承順に左から右に構造関数を呼び出して初期化する
2、メンバー変数を呼び出すコンストラクション関数を初期化し、宣言順に上から下へ
3,メンバ変数が初期化されていない場合は,2ステップをスキップして,サブクラス構造関数の関数体を直接初期化する.
ダミーベースクラスvirtual
1つのサブクラスの複数の親が同時に別の共通の親から派生する場合、複数の親には同じ親から継承された同じ名前のメンバーがあり、サブクラスでは、これらの同じ名前のメンバーは内潤に複数のコピーがあり、同じ関数名に複数のマッピングがあります.虚ベースクラスを使用すると、このような問題を解決することができます.
class Subclass:<strong>virtual</strong> public A

ダミーベースクラスの初期化
通常、各クラスは自分の直接ベースクラスのみを初期化します.継承関係全体で、仮想ベースクラスを直接または間接的に継承するすべての派生クラスは、構造関数のメンバー初期化リストに仮想ベースクラスの初期化をリストする必要があります.