C++メッセージ(メンバー関数呼び出し)の動的バインド
1510 ワード
1.メッセージの多態性
C++はクラスをタイプと見なし,public方式(厳密にはpublic方式のみ)で継承された派生クラスをベースクラスのサブタイプと見なし,C++オブジェクト向けプログラムには次の3つのマルチステートが存在する.
1)オブジェクトタイプのマルチステート:派生クラスオブジェクトのタイプは、派生クラスであってもベースクラスであってもよい.
2)オブジェクトフラグのマルチステート:ベースクラスのポインタまたは参照は、ベースクラスオブジェクトを指すか参照するか、派生クラスオブジェクトを指すか参照することができます.(ただし、派生クラスのポインタは派生クラスオブジェクトのみを指すか、参照することができ、ベースクラスオブジェクトを指すことができず、多くのものを少なくすることができるが、少ないものを多くすることはできないと理解できる.)
3)メッセージのマルチステート,ベースクラスオブジェクトに送信可能なメッセージ,派生クラスオブジェクトに送信可能である.
2.静的バインド
コンパイル時にデータのタイプをバインドします.(デフォルト)
3.動的バインド
実行時にデータをバインドするタイプ.
3.虚関数とメッセージの動的バインド
1)虚関数の定義
関数の戻りタイプにvirtualを付ける
制限:
a.クラスのメンバー関数のみが虚関数である
b.静的メンバー関数は虚関数ではない
c.コンストラクション関数は虚関数ではない
d.構造関数は(往々にして)虚関数であってもよい
2)虚関数の動的バインド
ベースクラスのメンバー関数の1つが虚関数として定義されている場合、派生クラスで定義された同じ構造のメンバー関数は、ベースクラスのメンバー関数の再定義(またはオーバーライド、override)である.
≪同一スキーマ|Same Structure|oem_src≫:関数名が同じ、パラメータ・タイプと個数が同じ、戻り値タイプが同じ、またはベース・クラス・メンバー関数の戻り値タイプの派生クラス
C++はクラスをタイプと見なし,public方式(厳密にはpublic方式のみ)で継承された派生クラスをベースクラスのサブタイプと見なし,C++オブジェクト向けプログラムには次の3つのマルチステートが存在する.
1)オブジェクトタイプのマルチステート:派生クラスオブジェクトのタイプは、派生クラスであってもベースクラスであってもよい.
2)オブジェクトフラグのマルチステート:ベースクラスのポインタまたは参照は、ベースクラスオブジェクトを指すか参照するか、派生クラスオブジェクトを指すか参照することができます.(ただし、派生クラスのポインタは派生クラスオブジェクトのみを指すか、参照することができ、ベースクラスオブジェクトを指すことができず、多くのものを少なくすることができるが、少ないものを多くすることはできないと理解できる.)
3)メッセージのマルチステート,ベースクラスオブジェクトに送信可能なメッセージ,派生クラスオブジェクトに送信可能である.
2.静的バインド
コンパイル時にデータのタイプをバインドします.(デフォルト)
3.動的バインド
実行時にデータをバインドするタイプ.
class A
{
int x,y;
public:
void f();
}
class B: public A
{
int z;
public:
void f();
void g();
}
void func1(A& x)
{
x.f();// A::f, C++
}
void func2(A* p)
{
p->f();// A::f, C++
}
3.虚関数とメッセージの動的バインド
1)虚関数の定義
関数の戻りタイプにvirtualを付ける
class A
{...
public:
virtual void f();//
}
制限:
a.クラスのメンバー関数のみが虚関数である
b.静的メンバー関数は虚関数ではない
c.コンストラクション関数は虚関数ではない
d.構造関数は(往々にして)虚関数であってもよい
2)虚関数の動的バインド
ベースクラスのメンバー関数の1つが虚関数として定義されている場合、派生クラスで定義された同じ構造のメンバー関数は、ベースクラスのメンバー関数の再定義(またはオーバーライド、override)である.
≪同一スキーマ|Same Structure|oem_src≫:関数名が同じ、パラメータ・タイプと個数が同じ、戻り値タイプが同じ、またはベース・クラス・メンバー関数の戻り値タイプの派生クラス
class A
{
int x;
public:
virtual void f();
}
class B: public A
{
int y;
public:
void f();
void g();
}
A *p = new B;
p->f(); //OK, B f
p->g(); //Error, A g
((B*)p)->g(); //OK, B g