ポリモーフィズムの概念:静的ポリモーフィズムと動的ポリモーフィズムに分けられた、同じものの複数の兆候。
1. 静的ポリモーフィズムは、関数のオーバーロードやジェネリックプログラミングのように、コンパイル時に反映されます。
関数のオーバーロード:
- スコープは同じです。
- いくつかの関数は同様の関数を持ち、同じ関数名を持っています。
- パラメータは同じではありません(異なるパラメータタイプ、数、または順序)。
- 呼び出すときの関数のパラメータに従って、呼び出す関数を知ってください。
2. 実行時に反映される動的ポリモーフィズムは、次の2つの条件を満たす必要があります。
- 仮想関数
決定関数は仮想関数(書き換え可能)のメンバーではありません。2つの3つの条件があります:
1)基本クラスと派生クラスで定義された2つのそれぞれのメンバー関数;
2)基本クラスで定義されたメンバー関数は必須です。キーワードvirtualを使用すると、派生クラスのメンバー関数を取得するかどうかを指定できます。
3)2つのメンバー関数プロトタイプ(関数名、関数パラメーター、関数の戻り値の型)は同じである必要があります。注:これら2つの関数の戻り値の型が基本クラスと派生クラスであり、戻り値が基本クラスと派生クラスへのポインターまたは参照である場合も、上書きを構成します。この戻り値の型は共分散と呼ばれます。
2.オブジェクトの仮想関数を呼び出すときは、オブジェクトポインターまたは参照を使用します。これにより、ポインターが異なるオブジェクトを指すときに、異なるタイプのメンバー関数を呼び出すことができ、ポリモーフィズムが反映されます。
プログラム分析は次のとおりです。
#include<iostream>
using namespace std;
class Grandam
{
public:
virtual void introduce_self()
{
cout << "I am grandam." << endl;
}
};
class Mother:public Grandam
{
public:
void introdude_self()
{
cout << "I am mother." << endl;
}
};
class Daughter :public Mother
{
public:
void introduce_self()
{
cout << "I am daughter." << endl;
}
};
int main()
{
Grandam* ptr;
Grandam g;
Mother m;
Daughter d;
ptr = &g;
ptr->introduce_self();
ptr = &m;
ptr->introduce_self();
ptr = &d;
ptr->introduce_self();
return 0;
}
結果を図に示します。
結果から、オブジェクトの仮想関数introduce_self()バージョンが毎回実行されることがわかります。これは、実行時のポリモーフィズムを反映しています。