Latest web development tutorials

C ++多型

多型は、文字通り、様々な形態ということを意味します。クラス階層間の継承を介して、クラス間の場合には関連性、および多型を使用します。

C ++メンバ関数が多型の平均を呼び出すと、関数が呼び出されるオブジェクトの種類に応じて異なる機能を実行することになります。

次のように以下の実施例は、基本クラスの形状は、二つのカテゴリーのために導出されます。

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

Parent class area
Parent class area

プログラムの実施の準備ができる前に呼び出される関数-エラーの原因は、これは静的な多型、または静的リンクと呼ばれている、()基本クラス・コンパイラのバージョンとして設定されている機能領域を呼び出し、出力されます。 プログラムのコンパイル時の面積()関数が設定されているので、時にはそれはまた、事前バインディングと呼ばれています。

しかし、今、次のようにわずかにShapeクラス、第一の領域()文で変更されたプログラムは、キーワード仮想を配置てみましょう:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

例のコードの前にコンパイルして実行時に変更した後、それは次のような結果が生成されます。

Rectangle class area
Triangle class area

この場合、コンパイラではなく、そのタイプよりも、コンテンツを参照するにはポインタです。 したがって、以降のアドレス記憶トリと*形状のrecのクラスオブジェクト、およびそれがそれぞれの地域()関数を呼び出します。

あなたが見ることができるように、各クラスは独立を達成するために)(サブ関数の面積を有しています。 これは、多型の一般的な使用です。多型を使用すると、いくつかの異なるすべて同じ名前のクラスが、関数のパラメータを持つことができ、機能は同じであっても、異なる実装を持つことができます。

仮想関数

仮想関数が基底クラスの関数でvirtualキーワードを使用して宣言されています。再定義、基本クラスの仮想関数は、派生クラスで定義されている場合は、静的関数にリンクされないようにコンパイラに指示します。

プログラム内の任意の点が呼び出されたオブジェクトの関数呼び出しの種類に応じて選択することができる私たちが欲しいのは、この操作は、動的リンクと呼ばれるまたは遅延バインディングされています

純粋仮想関数

あなたはそこになりますので、派生クラスは、オブジェクトの方が適し関数を再定義していますが、基本クラスの仮想関数の意味の実装を与えることはできませんが、この時、基底クラスの仮想関数を定義することもできます純粋仮想関数を使用します。

私たちは、基本クラスの仮想関数の面積()は以下のように読み取ることができます:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

= 0は、純粋仮想関数である仮想関数の上、関数本体がないようコンパイラーに指示します