C++メッセージ(メンバー関数呼び出し)の動的バインド

1510 ワード

1.メッセージの多態性
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