2016-06-01 4 views
9

多型性を理解し、オーバーロードを漠然と理解していますが、カテゴリの違いが何であるか、過負荷が多型の一形態であるかどうかを説明する2つの概念を徹底的に理解している人には感謝します(これについては不一致です)。多型と過負荷の違いは何ですか?

+1

あなたはWikipediaで調べるよりも悪いことができます:https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29 – Galik

+0

Haskellには、パラメトリック多型*があります。 'length :: [a] - > Int'は文字列のリスト、Doublesのリストなどのために働きます。パラメトリック多形値はパラメータが何であるかを気にしないので、必要なのはひとつの定義だけです。 また、*アドホック多型*のために使用するタイプファクタを持ちます。実装が型依存型の関数です。 'show :: Show a => a - > String'はそれぞれ独自の定義を持つ関数群です:' show :: Int - > String、show :: Double - > String、... '。 – rampion

答えて

8

多態性は、その核となるすべてのものが、一貫性のある一連の動作を持っているため、あるものを別のものに置き換えることができます特定のアルゴリズムまたはプロセス内で実行されます。彼らがすべて期待されたインターフェイスを提供している限り、プロセスはまだ動作します。

オーバーロードには本当にそのような基盤がありません。異なるパラメータリストを持つ限り、同じ名前の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の関数のオーバーロードを使用します。しかし、これは、オーバーロード多型であることを意味しません。

オーバーロードは言語ツールです。多形性は概念です。多態性は、複数のオブジェクトをすべて同じ方法で動作させることです。オーバーロードは、異なる関数に同じ名前を付けるための単なる方法です。

4

多型:呼び出される引数の型に応じて複数の実装を持つ1つのメソッド。しばしばコンパイル時には知られていない。引数の数は固定されていますが、C++では、型の問題が最初の引数(this)だけです。 C++では、これの一般的なバージョンはvirtualメソッドを持つ基本クラスを必要とします。

オーバーロード:1つの名前は、呼び出される引数の数と型に応じて、実際には複数のメソッドです。常にコンパイル時に決定します。基本クラスは含まれません。

類推を希望する場合:多形性とは、車に取り組む専門家を12人雇用し、それぞれがdo_work(vehicle)take_vacation(duration)のような機能を持つ場合です。それぞれ異なるものがありますが、C++の "暗黙のthis"引数(Pythonなどでselfとも呼ばれます)とは別に、すべて同じシグネチャを持っています。

+0

最後の段落は金です! –

+0

"コンパイル時の多型"はどうですか? –

+0

@NickyC:C++には、コンパイル時にどの実装を呼び出す必要があるかを見ることができるため、コンパイル時の多型には2種類あります。テンプレートメタプログラミングを使用する言語機能の種類です。最初の方法は 'virtual'メソッドに依存しますが、パフォーマンスは向上します。 2番目は型を明示的に使用してプログラミングすることに依存します。 –

1

オーバーロードは、ポリモーフィズムのサブセットであるなど、あなたがジェネラリストメカニックを雇う際のオーバーロードがあり、それらの一つ一つはdo_work(steering)do_work(lighting)do_work(engine)を持っています。多態性には、実行時とコンパイル時の2種類があります。オーバーロードは(、関数ポインタ他のいくつかのコンパイル時/静的ポリモーフィズムの面にも同様テンプレートがある

通常著者は、実行時に行われるものに多型を参照してください。後者のいずれかに属し(指定ない限り)し、その多型について話している場合は、明確に 1つは、(ジョンの答えはすでにそこに彼の答えでの基本的な違いのWRT 継承/仮想関数を描いた)とオーバーロードがあり、実行時に行われますcで終わったあなたの関数のパラメータが呼び出されるオーバーロードを決定するときの時間を累積します。

オーバーロード - 静的ポリモーフィズム(デモンストレーション)

関数のオーバーロードが静的であるかを証明することができ、スクリーンショットを以下の(が実行時前に解決

enter image description here

PS

これは、関連する質問です。overloading and virtual functions

+2

C++には、 "静的多型"もありますが、これは過負荷ではありません。 –

+0

@ JohnZwinck私はその1つのタイプの静的多型を意味しました。しかし、そこに注目を集めることに感謝します。私はそれを更新しました –

+0

私はすべての関数のオーバーロードが動的多型の一種だとは思わない。コンパイラは、コンパイル時に非仮想関数のオーバーロードを解決する必要があります。 –

関連する問題