C++継承と派生
10695 ワード
1、継承&派生
新しいクラスBを定義する際に、ある既存のクラスAと類似していれば(BはAのすべての特徴を持つ)、Aをベースクラスとし、Bをベースクラスの派生クラス(サブクラス)とすることができる.
派生クラスの各メンバー関数では、ベースクラスのprivateメンバーにアクセスできません.
派生クラスオブジェクトのボリュームは、ベースクラスオブジェクトのボリューム+派生クラスオブジェクト独自のメンバー変数のボリュームに等しい.
派生クラスオブジェクトには、ベースクラスオブジェクトが含まれており、ベースクラスオブジェクトの格納場所は、派生クラスオブジェクトに追加されたメンバー変数の前にあります.
2、継承&複合
継承:「はい」関係.
-ベースクラスA、BはベースクラスAの派生クラスである.
-論理的には、「1つのBオブジェクトも1つのAオブジェクトである」ことが要求されます.
•複合:「有」関係.
-クラスCのメンバー変数k、kはクラスDのオブジェクトであり、CとDは複合関係である
-一般的に論理的には、「DオブジェクトはCオブジェクトの固有の属性または構成部分である」という要件があります.
3、アクセス範囲説明子
(1)private:
ベースクラスのメンバー関数、ベースクラスの友元関数にアクセスできます.
(2)public:
ベースクラスのメンバー関数、ベースクラスの友元関数、派生クラスのメンバー関数、派生クラスの友元関数、その他の関数によってアクセスできます.
(3)protected
ベースクラスのメンバー関数、ベースクラスのメタ関数、派生クラスのメンバー関数によってアクセスできます.また、派生クラスのメンバー関数は、現在のオブジェクトのベースクラスの保護メンバーにアクセスできます.
4、派生クラスの構築関数
(1)派生クラスコンストラクタを実行する前にベースクラスコンストラクタを実行する.
明示的:派生クラスのコンストラクション関数でベースクラスのコンストラクション関数にパラメータを提供する
暗黙方式:派生クラスのコンストラクション関数で、ベースクラスのコンストラクション関数を省略すると、派生クラスのコンストラクション関数が自動的に呼び出されます.
派生クラスの解析関数が実行されると、派生クラスの解析関数が実行された後、ベースクラスの解析関数が自動的に呼び出されます.
(2)メンバーオブジェクトを含む派生クラスの構築関数
派生クラスのオブジェクトを作成するときに、派生クラスのコンストラクション関数を実行する前に:
•ベースクラスのコンストラクション関数を呼び出し、派生クラスオブジェクトのベースクラスから継承されたメンバーを初期化します.
•メンバー・オブジェクト・クラスのコンストラクション関数を呼び出し、派生クラス・オブジェクトのメンバー・オブジェクトを初期化
•派生クラスの構造関数を実行した後、メンバー・オブジェクト・クラスの構造関数を呼び出し、ベースクラスの構造関数を呼び出します.構造関数の呼び出し順序は、構造関数の呼び出し順序とは逆です.
5、public継承の賦値互換規則
(1)派生クラスのオブジェクトをベースクラスオブジェクトに割り当てることができる
b = d;
(2)派生クラスオブジェクトがベースクラスの参照を初期化できる
base &br = d;
(3)派生クラスオブジェクトのアドレスをベースクラスポインタにコピーできる
base *pb = &d;
Note:protectedまたはprivateが継承されている場合は成立しません.
6.直接ベースクラスと間接ベースクラス
派生クラスを宣言する場合は、直接ベースクラスをリストするだけです.
派生クラスのメンバーには、派生クラスが独自に定義したメンバー、直接ベースクラス内のすべてのメンバー、すべての間接ベースクラス内のすべてのメンバーが含まれます.
新しいクラスBを定義する際に、ある既存のクラスAと類似していれば(BはAのすべての特徴を持つ)、Aをベースクラスとし、Bをベースクラスの派生クラス(サブクラス)とすることができる.
派生クラスの各メンバー関数では、ベースクラスのprivateメンバーにアクセスできません.
class :public
{
};
派生クラスオブジェクトのボリュームは、ベースクラスオブジェクトのボリューム+派生クラスオブジェクト独自のメンバー変数のボリュームに等しい.
派生クラスオブジェクトには、ベースクラスオブジェクトが含まれており、ベースクラスオブジェクトの格納場所は、派生クラスオブジェクトに追加されたメンバー変数の前にあります.
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;
}