C ++の静的ポリモーフィズムと動的ポリモーフィズム

静的ポリモーフィズムと動的ポリモーフィズム


静的ポリモーフィズム

  • 静的ポリモーフィズムは、コンパイル時ポリモーフィズムとも呼ばれます。これは、コンパイル時に呼び出すメソッドを意味します。
  • 静的ポリモーフィズムは通常、メソッドの繰り返しを指します。
  • メソッドのオーバーロードが構成されている限り、静的ポリモーフィズムの条件が形成されていると見なすことができます。
  • 静的ポリモーフィズムは、継承が発生するかどうかに必ずしも関係していません

次のように:

void test(int a){cout << "1" << endl; }
void test(int a、int y){cout << "2" << endl; }
void test(int a、int y、int z){cout << "2" << endl; }
int main()
{     test(1);     test(1、2);     test(1、2、3);


呼び出される3つの関数の名前は同じですが、どの関数が呼び出されるかまでコンパイルされています。

同じ関数に対するさまざまな応答は、コンパイル前にわかっています。


動的ポリモーフィズム

  • 動的ポリモーフィズムはランタイムポリモーフィズムとも呼ばれます。つまり、呼び出すメソッドは実行時にのみ決定できます。
  • 動的ポリモーフィズムを形成するには、次の条件を指定する必要があります。継承は、動的ポリモーフィズムを実現するための主要な前提条件です
  • 継承にはメソッドカバレッジが必要です。
  • 基本クラスの参照は、派生クラスのインスタンスを指している必要があり、オーバーライドされたメソッドは、基本クラスの参照を介して呼び出される必要があります。

この場所は、私の別のブログのコードを参照しています。

つまり、動物を基本クラスとして使用し、cat、dog、pigの3つの派生クラスを生成し、動物配列を定義します。配列の各位置は、基本クラスと派生クラスの間で変換されます。

このとき、コンパイル時に配列の3つの位置すべてでshow関数を呼び出すと、クラスオブジェクトのshow関数を区別できず、実行時に認識されます。これを動的ポリモーフィズムと呼びます。

#include<iostream>
using namespace std;

class animal
{
public:
	virtual void show()
	{
		cout << "我是animal类" << endl;
	}
};

class dog :public animal
{
public:
	void show()
	{
		cout << "我是dog类" << endl;
	}
};

class cat :public animal
{
public:
	void show()
	{
		cout << "我是cat类" << endl;
	}
};

class pig :public animal
{
public:
	void show()
	{
		cout << "我是pig类" << endl;
	}
};

int main()
{
	cat a; dog b; pig c;
	animal *x[3] = { &a, &b, &c };
	
	for (int i = 0; i < 3; i++)
	{
		x[i]->show();
	}
	system("pause");
	return 0;
}

比較する

静的ポリモーフィズム

利点:

  1. 静的ポリモーフィズムはコンパイル中に完了するため、より効率的であり、コンパイラーも最適化できます。
  2. 特殊なタイプを処理するための部分的な特殊化や完全な特殊化など、強力な適応性と疎結合を備えています。
  3. 最も重要な点は、静的ポリモーフィズムが、強力なSTLライブラリなどのテンプレートプログラミングを通じて、汎用設計の概念をC ++にもたらすことです。

短所:

  1. 静的ポリモーフィズムを実装するためのテンプレートであるため、テンプレートの欠点は、デバッグの難しさ、時間のかかるコンパイル、コード拡張、コンパイラサポートの互換性など、静的ポリモーフィズムの欠点です。
  2. 異種オブジェクトコレクションを処理できない

動的ポリモーフィズム

利点:

  1. オブジェクト指向設計、客観的な世界の直感的な理解。
  2. 実装とインターフェースの分離、再利用可能
  3. 同じ継承システムの下で異種オブジェクトコレクションを処理する強力な能力

短所:

  1. ランタイムバインディング。ある程度のランタイムオーバーヘッドが発生します。
  2. コンパイラは仮想関数を最適化できません
  3. かさばるクラス継承システムであるインターフェイスの変更は、クラス階層全体に影響します。

差:

  1. 本質は異なります。静的ポリモーフィズムはコンパイル時に決定され、テンプレートの実現によって完了しますが、動的ポリモーフィズムは実行時に決定され、継承と仮想関数によって実現されます。
  2. 動的ポリモーフィズムのインターフェイスは明示的で、関数シグネチャを中心とし、ポリモーフィズムは実行時に仮想関数を介して実現され、静的マルチステーションのインターフェイスは暗黙的で、有効な式を中心とし、ポリモーフィズムはコンパイル時にテンプレートを介して存在します。アウト

同じ点:

  1. すべてがポリモーフィズム、静的ポリモーフィズム/コンパイル時ポリモーフィズム、動的ポリモーフィズム/実行時ポリモーフィズムを達成できます。
  2. どちらもインターフェースと実装を分離できます。1つはテンプレート定義インターフェースであり、typeパラメーターは実現を定義し、もう1つは基本クラスの仮想関数定義インターフェースであり、継承されたクラスが実装を担当します。

 

おすすめ

転載: blog.csdn.net/qq_46423166/article/details/112385698