C++継承と派生

10695 ワード

1、継承&派生
新しいクラスBを定義する際に、ある既存のクラスAと類似していれば(BはAのすべての特徴を持つ)、Aをベースクラスとし、Bをベースクラスの派生クラス(サブクラス)とすることができる.
派生クラスの各メンバー関数では、ベースクラスのprivateメンバーにアクセスできません.
classpublic    
{
};

派生クラスオブジェクトのボリュームは、ベースクラスオブジェクトのボリューム+派生クラスオブジェクト独自のメンバー変数のボリュームに等しい.
派生クラスオブジェクトには、ベースクラスオブジェクトが含まれており、ベースクラスオブジェクトの格納場所は、派生クラスオブジェクトに追加されたメンバー変数の前にあります.
2、継承&複合
継承:「はい」関係.
-ベースクラスA、BはベースクラスAの派生クラスである.
-論理的には、「1つのBオブジェクトも1つのAオブジェクトである」ことが要求されます.
•複合:「有」関係.
-クラスCのメンバー変数k、kはクラスDのオブジェクトであり、CとDは複合関係である
-一般的に論理的には、「DオブジェクトはCオブジェクトの固有の属性または構成部分である」という要件があります. 
class CMaster; //CMaster      ,    CMaster   Cdog 
class CDog {
 CMaster * pm;
};
class CMaster {
 CDog * dogs[10];
}; 

3、アクセス範囲説明子
(1)private:
ベースクラスのメンバー関数、ベースクラスの友元関数にアクセスできます.
(2)public:
ベースクラスのメンバー関数、ベースクラスの友元関数、派生クラスのメンバー関数、派生クラスの友元関数、その他の関数によってアクセスできます.
(3)protected
ベースクラスのメンバー関数、ベースクラスのメタ関数、派生クラスのメンバー関数によってアクセスできます.また、派生クラスのメンバー関数は、現在のオブジェクトのベースクラスの保護メンバーにアクセスできます.
class Father {
private: int nPrivate; //    
public: int nPublic; //    
protected: int nProtected; //     
};
class Son : public Father {
    void AccessFather () {
        nPublic = 1; // ok;
        nPrivate = 1; // wrong
        nProtected = 1; // OK,         protected  
        Son f;
        f.nProtected = 1; //wrong, f      
    }
};
int main(){
    Father f;
    Son s;
    f.nPublic = 1; // Ok
    s.nPublic = 1; // Ok
    f.nProtected = 1; // error
    f.nPrivate = 1; // error
    s.nProtected = 1; //error
    s.nPrivate = 1; // error
    return 0; 
}    

4、派生クラスの構築関数
(1)派生クラスコンストラクタを実行する前にベースクラスコンストラクタを実行する.
     (   ):    (         )
{
}

明示的:派生クラスのコンストラクション関数でベースクラスのコンストラクション関数にパラメータを提供する
derived::derived(arg_derived-list):base(arg_base-list)

暗黙方式:派生クラスのコンストラクション関数で、ベースクラスのコンストラクション関数を省略すると、派生クラスのコンストラクション関数が自動的に呼び出されます.
派生クラスの解析関数が実行されると、派生クラスの解析関数が実行された後、ベースクラスの解析関数が自動的に呼び出されます.
(2)メンバーオブジェクトを含む派生クラスの構築関数
class Skill {
 public:
 Skill(int n) { }
};
class FlyBug: public Bug {
 int nWings;
 Skill sk1, sk2;
 public:
 FlyBug(int legs, int color, int wings);
};
FlyBug::FlyBug( int legs, int color, int wings):
Bug(legs, color), sk1(5), sk2(color) {
 nWings = wings;
}

派生クラスのオブジェクトを作成するときに、派生クラスのコンストラクション関数を実行する前に:
•ベースクラスのコンストラクション関数を呼び出し、派生クラスオブジェクトのベースクラスから継承されたメンバーを初期化します.
•メンバー・オブジェクト・クラスのコンストラクション関数を呼び出し、派生クラス・オブジェクトのメンバー・オブジェクトを初期化
•派生クラスの構造関数を実行した後、メンバー・オブジェクト・クラスの構造関数を呼び出し、ベースクラスの構造関数を呼び出します.構造関数の呼び出し順序は、構造関数の呼び出し順序とは逆です.
5、public継承の賦値互換規則
class base { };
class derived : public base { };
base b;
derived d;

(1)派生クラスのオブジェクトをベースクラスオブジェクトに割り当てることができる
  b = d;
(2)派生クラスオブジェクトがベースクラスの参照を初期化できる
  base &br = d;
(3)派生クラスオブジェクトのアドレスをベースクラスポインタにコピーできる
  base *pb = &d;
Note:protectedまたはprivateが継承されている場合は成立しません.
6.直接ベースクラスと間接ベースクラス
派生クラスを宣言する場合は、直接ベースクラスをリストするだけです.
派生クラスのメンバーには、派生クラスが独自に定義したメンバー、直接ベースクラス内のすべてのメンバー、すべての間接ベースクラス内のすべてのメンバーが含まれます.
#include 
using namespace std;
class Base {
public:
    int n;
    Base(int i):n(i) {
        cout << "Base " << n << " constructed" << endl;
    }
    ~Base() {
        cout << "Base " << n << " destructed" << endl;
    }
};
class Derived:public Base
{
public:
    Derived(int i):Base(i) {
        cout << "Derived constructed" << endl;
    }
    ~Derived() {
        cout << "Derived destructed" << endl;
    }
};
class MoreDerived:public Derived {
public:
    MoreDerived():Derived(4) {
       cout << "More Derived constructed" << endl;
    }
    ~MoreDerived() {
        cout << "More Derived destructed" << endl;
    }
};
int main()
{
    MoreDerived Obj;
    return 0;
}