多型性を理解し、オーバーロードを漠然と理解していますが、カテゴリの違いが何であるか、過負荷が多型の一形態であるかどうかを説明する2つの概念を徹底的に理解している人には感謝します(これについては不一致です)。多型と過負荷の違いは何ですか?
答えて
多態性は、その核となるすべてのものが、一貫性のある一連の動作を持っているため、あるものを別のものに置き換えることができます特定のアルゴリズムまたはプロセス内で実行されます。彼らがすべて期待されたインターフェイスを提供している限り、プロセスはまだ動作します。
オーバーロードには本当にそのような基盤がありません。異なるパラメータリストを持つ限り、同じ名前の2つ以上の関数に名前を付けるだけの機能です。コンパイラは、渡した引数の型に基づいて実際にどの関数を意味しているのかを調べます。
多型を作成するためにオーバーロードを使用できるようになりました。次のことを考えてみましょう:
template<typename T>
void func(T t) {call(t);}
これは、パラメータとしてt
を渡し、call
を呼び出します。これはcall(t)
が正当なC++コードであるタイプT
を提供している限り動作します。あなたはfunc
で使用することに興味を持っているどんなタイプのための機能call
をオーバーロードすることによってこれを行うことができます:
void call(int);
void call(float);
void call(vector<int>);
このように、func
が多型(静的)そのパラメータに関してである機能です。そのタイプが適切なインターフェースを持っている限り、どのタイプのオペレーションも実行できます。そのインターフェイスは、そのタイプの変数で関数call
を呼び出すことができます。ここで
func(5); //Legal
func(13.4); //Legal
func(vector<int>{4, 3, 2, 1}); //Legal
func(vector<float>{}); //NOT legal
、我々はfunc
機能によってpolymophismのフォームを作成するためにcall
の関数のオーバーロードを使用します。しかし、これは、オーバーロードが多型であることを意味しません。
オーバーロードは言語ツールです。多形性は概念です。多態性は、複数のオブジェクトをすべて同じ方法で動作させることです。オーバーロードは、異なる関数に同じ名前を付けるための単なる方法です。
多型:呼び出される引数の型に応じて複数の実装を持つ1つのメソッド。しばしばコンパイル時には知られていない。引数の数は固定されていますが、C++では、型の問題が最初の引数(this
)だけです。 C++では、これの一般的なバージョンはvirtual
メソッドを持つ基本クラスを必要とします。
オーバーロード:1つの名前は、呼び出される引数の数と型に応じて、実際には複数のメソッドです。常にコンパイル時に決定します。基本クラスは含まれません。
類推を希望する場合:多形性とは、車に取り組む専門家を12人雇用し、それぞれがdo_work(vehicle)
とtake_vacation(duration)
のような機能を持つ場合です。それぞれ異なるものがありますが、C++の "暗黙のthis"引数(Pythonなどでself
とも呼ばれます)とは別に、すべて同じシグネチャを持っています。
最後の段落は金です! –
"コンパイル時の多型"はどうですか? –
@NickyC:C++には、コンパイル時にどの実装を呼び出す必要があるかを見ることができるため、コンパイル時の多型には2種類あります。テンプレートメタプログラミングを使用する言語機能の種類です。最初の方法は 'virtual'メソッドに依存しますが、パフォーマンスは向上します。 2番目は型を明示的に使用してプログラミングすることに依存します。 –
オーバーロードは、ポリモーフィズムのサブセットであるなど、あなたがジェネラリストメカニックを雇う際のオーバーロードがあり、それらの一つ一つはdo_work(steering)
、do_work(lighting)
、do_work(engine)
を持っています。多態性には、実行時とコンパイル時の2種類があります。オーバーロードは(、関数ポインタ他のいくつかのコンパイル時/静的ポリモーフィズムの面にも同様テンプレートがある)
通常著者は、実行時に行われるものに多型を参照してください。後者のいずれかに属し(指定ない限り)し、その多型について話している場合は、明確に 1つは、(ジョンの答えはすでにそこに彼の答えでの基本的な違いのWRT 継承/仮想関数を描いた)とオーバーロードがあり、実行時に行われますcで終わったあなたの関数のパラメータが呼び出されるオーバーロードを決定するときの時間を累積します。
オーバーロード - 静的ポリモーフィズム(デモンストレーション)
関数のオーバーロードが静的であるかを証明することができ、スクリーンショットを以下の(が実行時前に解決)
PS
これは、関連する質問です。overloading and virtual functions
C++には、 "静的多型"もありますが、これは過負荷ではありません。 –
@ JohnZwinck私はその1つのタイプの静的多型を意味しました。しかし、そこに注目を集めることに感謝します。私はそれを更新しました –
私はすべての関数のオーバーロードが動的多型の一種だとは思わない。コンパイラは、コンパイル時に非仮想関数のオーバーロードを解決する必要があります。 –
- 1. サーバーの過負荷:
- 2. インスタンス過負荷メッセージボックス
- 3. MFC - メッセージボックス過負荷
- 4. 過負荷デフォルトインタフェースメソッドJavaで8
- 5. Apacheエラーログ - サーバが過負荷ですか?
- 6. イーガー負荷(含む)多型関連
- 7. C#の過負荷問題
- 8. サイレックス・過負荷クラスのユーザー
- 9. のstd ::過負荷エラー
- 10. itextsharp PdfReader過負荷エラー
- 11. C++運転、過負荷、クラッシュ
- 12. 過負荷参照変換
- 13. 曖昧過負荷C++ =
- 14. テンプレートと多型の違いは何ですか
- 15. 相続と多型の違いは何ですか?
- 16. は、Javaでは、私は、フロートと過負荷と
- 17. Androidアプリケーションの場合、Hibernateは過度の負荷ですか?
- 18. Kotlinで過負荷になる
- 19. この関数は過負荷ですか?
- 20. HazelcastのMapReduceのエグゼキュータの過負荷
- 21. MVCコントローラのアクションの過負荷
- 22. 過負荷演算子の式のパフォーマンス?
- 23. 「subbut_Click」マッチデリゲートのための過負荷「System.EventHandler」
- 24. システム負荷とユーザー負荷
- 25. 過負荷の問題=機能
- 26. C++演算子の過負荷チートシート
- 27. メソッドのパラメータおよび過負荷
- 28. 過負荷演算子のエラー>>
- 29. は、私が過負荷を持つ2つの非常に類似した過負荷に
- 30. 過負荷関数テンプレートパラメータ関数の引数の型に基づいて
あなたはWikipediaで調べるよりも悪いことができます:https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29 – Galik
Haskellには、パラメトリック多型*があります。 'length :: [a] - > Int'は文字列のリスト、Doublesのリストなどのために働きます。パラメトリック多形値はパラメータが何であるかを気にしないので、必要なのはひとつの定義だけです。 また、*アドホック多型*のために使用するタイプファクタを持ちます。実装が型依存型の関数です。 'show :: Show a => a - > String'はそれぞれ独自の定義を持つ関数群です:' show :: Int - > String、show :: Double - > String、... '。 – rampion