マルチステート、オーバーライド、リロード、静的アセンブリ、動的アセンブリ.

3119 ワード

マルチステート:
C++マルチステートには2つの形式,動的マルチステートと静的マルチステートがある.
動的多態とは一般的な多態を指し、クラス継承と虚関数メカニズムによって実現される多態である.
静的マルチステートは、コンパイル時に非実行時であるため、静的マルチステートと呼ばれるテンプレート法によって実現される.
ダイナミックマルチステートの例:
class CShape
{
 public:
 CShape(){}
 virtual ~CShape(){}

 virtual void Draw() = 0;
};
class CPoint : public CShape
{
public:
 CPoint(){}
 ~CPoint(){}
 void Draw()
 {
   printf("Hello! I am Point!/n");
 }
};
class CLine : public CShape
{
  public:
 CLine(){}
 ~CLine(){}

 void Draw()//  
 {
  printf("Hello! I am Line!/n");
 }
};
void main()
{
 CShape* shape = new CPoint();//          
 //draw point
 shape->Draw();//   shape    CPoint Draw()  
 delete shape;

 shape = new CLine();
 //draw Line
 shape->Draw();//    shape    CLIne  Draw()  
 delete shape;
 return ;
}

上記の例から、皆さんは何が多態なのか理解できるはずです.つまりDrawです.()は2つの実装が可能であり,実行時に決定されているが,コンパイル段階では知らないし,知ることも不可能である!実行時にのみ我々が生成したshapeがその図形であることを知ることができるが,もちろんこの効果を実現するには動的な結合が必要であり,ベースクラスでは多状態にしたい関数を虚関数と宣言し,虚関数の実現原理は動的連編.
静的マルチステートの例:
上記の例に基づいてテンプレート関数を追加します.
template 
void DrawShape(T* t)
{
 t->Draw();
}
  main     :
void main()
{
 CShape* shape = new CPoint();
 //draw point
 shape->Draw();

 DrawShape((CPoint*)shape);
 delete shape;

 shape = new CLine();
 //draw Line
 shape->Draw();
 DrawShape((CLine*)shape);
 delete shape; 
 return ;
}

プログラムがmain関数をコンパイルする時、コンパイラはすでにDrawShape関数の中のDrawがそれを呼び出すことを指定して実現して、これは静的な多態で、コンパイルする時すでに呼び出す関数を知っています.
静的アセンブリと動的アセンブリ:(ここの例は正しいですか?)
静的コンパイルとは、コンパイル段階で関数実装と関数呼び出しを関連付けることであるため、静的コンパイルも早バインドと呼ばれ、コンパイル段階ではすべての関数またはモジュールが実行するために必要な検出情報を理解しなければならない.関数の選択は、オブジェクトを指すポインタ(または参照)のタイプに基づいており、C言語では、すべてのコンパイルが静的コンパイルであり、私が知っている限りでは、どのコンパイラも静的コンパイルをサポートしています(くだらない話).
動的アセンブリとは、プログラムが実行されるときに関数実装と関数呼び出しを関連付けることを意味します.したがって、実行時バインドまたは遅いバインドとも呼ばれます.動的アセンブリ対関数の選択はポインタまたは参照ではなく、オブジェクトタイプに基づいており、異なるオブジェクトタイプによって異なるコンパイル結果が得られます.C++では一般的にはコンポジットも静的コンポジットですが、マルチステートや仮想関数に触れると動的コンポジットを使用する必要があります.
静的アセンブリの例:
class shape{   public:     void draw(){cout<     void fun(){draw();} }; class circle:public shape{   public:     void draw(){cout< }; void main(){     circle  oneshape;     oneshape.fun(); }
ダイナミックアセンブリに変更する例:
class shape {   public:   virtual void draw(){cout< };   void fun(shape *ptr)  {ptr->draw();}
class circle:public shape {   public:     void draw(){cout<  }; int main() {      circle  oneshape,*p;     p=&oneshape;     fun(p);
   return 0; }
オーバーライド
≪オーバーライド|Override|emdw≫:ベース・クラスで非虚関数を定義し、派生クラスで同じ名前のパラメータと戻りタイプの関数を定義します.これがオーバーライドです.派生クラスオブジェクトでこの関数名を直接呼び出すと、派生クラスのそれだけが呼び出されます.
≪リロード|Reload|emdw≫:ベース・クラスで非虚関数を定義し、派生クラスで同名を定義しますが、異なるパラメータ・テーブルを持つ関数です.これがリロードです.派生クラスオブジェクトでこれらの関数を呼び出すと、異なるパラメータで異なる関数が呼び出され、ベースクラスのそれに直接呼び出される可能性があります.
マルチステート:ベースクラスに虚関数を定義し、派生クラスに同名のパラメータテーブルの関数を定義します.これがマルチステートです.マルチステートは,この3つのケースで動的バインド技術を用いた唯一のケースである.すなわち,オブジェクトを1つのベースクラスポインタで操作し,オブジェクトがベースクラスオブジェクトであればベースクラスのその関数を呼び出し,オブジェクトが実際に派生クラスオブジェクトであれば派音クラスのその関数を呼び出し,どの関数を呼び出すかは関数のパラメータによって決まるのではなく,関数の実際のタイプによって決まる.