C++ には、2 種類のポリモーフィズムがあります。
- オブジェクトのポリモーフィズム
- 関数多型
関数のポリモーフィズムは、メソッドまたは関数のオーバーロードとまったく同じです。つまり、同じメソッド名を異なるパラメーターと戻り値の型で使用します。ここで問題は、なぜOOP でこの派手な名前のポリモーフィズムがあるのかということです。
ポリモーフィズムとメソッドのオーバーロードを明確に区別するものは何ですか? 誰かがシナリオで説明できますか。ありがとう
C++ には、2 種類のポリモーフィズムがあります。
関数のポリモーフィズムは、メソッドまたは関数のオーバーロードとまったく同じです。つまり、同じメソッド名を異なるパラメーターと戻り値の型で使用します。ここで問題は、なぜOOP でこの派手な名前のポリモーフィズムがあるのかということです。
ポリモーフィズムとメソッドのオーバーロードを明確に区別するものは何ですか? 誰かがシナリオで説明できますか。ありがとう
ポリモーフィズムとは「複数のフォーム」を意味します。
コンピューター サイエンスでは、主に 3 種類のポリモーフィズムがあります。
ポリモーフィズムは概念です。アドホック ポリモーフィズムとは、同名の異なる実装を意味します。
// Function overloading
void f(A a);
void f(B b);
// template specialization
template <typename T> class A;
template <> class A<int> {}
template <> class A<float> {}
ポリモーフィズムの本質は、単一の構文形式(通常は C++ での関数呼び出し) によって異なる動作を提供できることです。この定義により、仮想関数呼び出し (実際には OOP ポリモーフィズムを表す) とオーバーロードされた関数呼び出しは両方ともポリモーフィックです。
それらの違いは、それぞれのケースで特定の動作が選択される方法とタイミングです。
仮想関数呼び出しの場合、関数メンバーが呼び出されるオブジェクトの動的タイプに応じて実行時に行われます。(もちろん、基本クラスのポインターまたは参照を介して呼び出された場合。直接呼び出された場合は、コンパイル時に選択されます)。
オーバーロードされた関数呼び出しの場合、関数呼び出しのシグネチャ (引数の型と数 + cv 修飾子) に従ってコンパイル時に作成されます。
つまり、違いを簡単に言えば、オーバーロードは静的ポリモーフィズムであり、コンパイル時に解決され、仮想関数は動的ポリモーフィズムであり、実行時に解決されます。
ポリモーフィズム: Poly => Multiple、Morph => Form。
簡単に言うと、C++ には多くのポリモーフィズム メカニズムがあり、関数のオーバーロードはポリモーフィズムの 1 つのタイプです。
2 つのことは次のように定義されます。
静的ポリモーフィズム: オーバーロードされた関数の関連付けは、静的ポリモーフィズムと呼ばれます。
関数のオーバーロード: 複数の関数\コンテキストが異なる動作\シグネチャで存在する場合、関数のオーバーロードと呼ばれます。
注: 1 つの関数が異なる署名で存在し、それらの関数をオブジェクトにバインドしていない場合、静的ポリモーフィズムがあるとは言えません。
ポリモーフィズムは、メソッドのオーバーロードと同じではありません。ウィキペディアから:
ポリモーフィズムは、メソッドのオーバーロードまたはメソッドのオーバーライドと同じではありません[1] (代わりに、アドホック ポリモーフィズム [2] として知られています)。ポリモーフィズムは、インターフェイスまたはより一般的な基本クラスへの特定の実装の適用にのみ関係します。メソッドのオーバーロードは、同じクラス内で同じ名前を持ち、シグネチャが異なるメソッドを指します。メソッドのオーバーライドは、サブクラスがその親のメソッドの 1 つ以上の実装を置き換える場所です。メソッドのオーバーロードもメソッドのオーバーライドも、それ自体ではポリモーフィズムの実装ではありません
ポリモーフィズムでは、メソッドはオーバーロードされずにオーバーライドされます (つまり、子オブジェクトは継承された関数の独自の実装を持ちますが、同じシグネチャを持ちます)。したがって、関数ポリモーフィズムと呼んでいるものは、実際にはメソッドのオーバーロードまたはアドホック ポリモーフィズムです。