28

私は、私が聞いている静的な多発性麻痺の概念についていくつか質問があります。それらは主にC++のコンテキストで解釈できますが、該当する場合は言語に依存しない回答をいただければ幸いです(したがって、C ++と言語に依存しない両方にタグを付けます)。

  1. 一般的に静的ポリモーフィズムをどのように定義しますか?例として、C ++の関数は、イテレータのように動作するstd::sortオブジェクトによって提供されるインターフェイスに依存し、提供されたイテレータのインターフェイスでの正確な動作はコンパイル時に決定できるため、静的にポリモーフィックと見なされると思います。この説明は、静的ポリモーフィズムを定義する方法ですか、それとも特定のケースの説明であり、それ以上のものがありますか?

  2. C ++で静的ポリモーフィズムを使用する一般的なコードパターンは何ですか?また:SPはC ++のテンプレートを介してのみ達成されますか?

  3. 特定のUMLクラス図は、ポリモーフィズムがどのように処理されるかを直接記述していないため、静的または動的に少なくとも部分的に実装できるというのは本当ですか?言い換えれば、静的ポリモーフィズムと動的ポリモーフィズムの選択は、OOPモデルとは無関係であり、したがって、実装者が決定する必要がありますか?

  4. 静的ポリモーフィズムはC++固有であり、テンプレートの動作に関連していますか?そうでない場合は、C ++以外の他の主流言語に存在しますか?Java、C#..で静的ポリモーフィズムに相当するものを使用できますか?それは何らかの利点をもたらしますか?

  5. 最も重要なのは...静的ポリモーフィズムを使用することの実際の利点は何ですか?コードの柔軟性が低下することに同意できると思います。-C ++の場合-1つのポインター逆参照(仮想関数/関数へのポインター/デリゲートコスト)を節約する以外に、どのような利点がありますか?静的ポリモーフィズムが特に役立つ問題のクラスは何ですか?実装の正しい選択ですか?

4

3 に答える 3

14
  1. 静的ポリモーフィック動作は、実行時ではなくコンパイル時に発生する型ポリモーフィズムです。
  2. はい。
  3. UMLは、実行時にクラスがどのように相互作用するかに関するものです。テンプレートを記述するためのUML形式があるとは思いませんが、間違っている可能性があります。
  4. 私の知る限り、これはC ++固有ですが、これまでに発明されたすべての言語を使用したことがないことを考えると、私は前向きではありません。:)とはいえ、C#やJavaなどのJIT言語は、コンパイル時ではなく実行時に収集された情報を使用して、間接呼び出しのパフォーマンスへの影響を取り除くのに非常に優れていることがよくあります。これがコンパイル時であるかどうかは、放送中のようなものですが...結局のところ、これはJust-In-Timeコンパイラと呼ばれます。
  5. 主な利点は単にパフォーマンスです。ランタイムポリモーフィズムは、静的ポリモーフィズムが実行できるすべてのことを実行できます(実際には、より多くのことを実行できます)が、間接呼び出しのコストがかかります(十分な数がある場合はコストがかかる可能性があります)

現在、テンプレート自体には、コンパイル時のポリモーフィズムを実現する以外にも多くの用途があります。たとえば、boost::bind作業を行うSFINAEマジックは確かにポリモーフィックではありません。これは、言語自体の不整合を滑らかにするためだけにあります。

于 2010-12-29T19:39:07.737 に答える
6

一般的に静的ポリモーフィズムをどのように定義しますか?

例を使用してそれを理解するための最良の方法。ポリシーベースの設計は、静的ポリモーフィズムの一例です。そして私の意見では、静的ポリモーフィズムを実現するのは非常に強力な手法です。

もう1つの例は、不思議なことに繰り返し発生するテンプレートパターン(CRTP)です。これも強力な手法です。

于 2010-12-29T19:35:20.663 に答える
0
  1. いいえ。テンプレートに加えて、メソッドoveloadingも静的ポリモーフィズムです。 https://en.wikipedia.org/wiki/Function_overloading
于 2014-10-21T08:13:29.390 に答える