web-dev-qa-db-ja.com

静的ポリモーフィズムの定義と実装

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

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

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

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

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

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

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

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

13
Billy ONeal

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

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

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

5
Nawaz
  1. いいえ。テンプレートに加えて、メソッドoveloadingも静的ポリモーフィズムです。 https://en.wikipedia.org/wiki/Function_overloading
0
Alex Blokha