ポリモーフィズムの必要性とは、異なるデータを同じ方法で処理する必要性です。異なる形状のデータセットに対して同じアルゴリズムを何度も再実装するよりも、そのアルゴリズムを 1 つだけ実装して、異なる演算子でパラメーター化する方がはるかに簡単ではないでしょうか?
それがポリモーフィズムの本質です。アルゴリズムから開始し、対話する必要があるインターフェイスを確立してから、そのインターフェイスの実装を構築します。C++ では、インターフェイスの概念はすべてのクラスで暗黙的です。どのクラスも 1 つのインターフェイスを公開し (ただし、その祖先を通じて多くのインターフェイスをサポートする場合があります)、その子孫もそれを実装します。特定のメソッドを仮想化することにより、子孫は、オブジェクトが外部から操作される方法を変更することなく、それらをオーバーライドして独自の内部構造に適応させることができます。
したがって、ポリモーフィズムとは、実際には、さまざまな形状を採用する可能性のある値であり、それらに均一にアクセスして操作する手段です。あなたの質問に答える際の重要なポイントは、おそらく、アルゴリズムが操作している実装を認識していないことです。のインスタンスで動作することをコードが認識しているため、Derived
そのメソッドを直接呼び出すことができる簡単な例を提供します。一般的なコード、またはインターフェイスを参照するコード (いわば) では、その知識は存在しないため、コードは基本クラスのメソッドに依存せざるを得なくなります (また、プログラマーは、そのコードで使用する予定のクラスが確実に使用されるようにする必要があります)。明確に定義されている - つまり仮想 - 必要な場合)。
ポリモーフィズムには多くの有用なアプリケーションがありますが、それらはすべて上記の原則から派生しています。
- 異種データセット(他の回答で示されているように)、
- インジェクション(同じインターフェースの異なる実装が実行時に別のものに交換される可能性がある)、
- テスト (より具体的には、特定のクラス C と対話するクラスが、C の正しい動作をテストするのに役立つダミーに置き換えられるモック)、
いくつか挙げると。コンパイル時のポリモーフィズム (テンプレート) と実行時のポリモーフィズム (virtual
メソッドと継承) はどちらも、方法や長所と短所は異なりますが、その目標を達成することに注意してください。