*/デメリット[編集]関数/メソッドおよび演算子が多重定義された場合、その名前だけで区別することができないので、多重定義の候補のうち、どのバージョンが使われるのかがソースコード上で一見して分かりづらく、可読性が下がる。中には、構文解析によりどのバージョンがどこで使われているかを列挙してくれるものも存在するが、そういったツールが使えない状況では読み手に詳細なルックアップの知識がないと判別が困難なこともある。const;};基本的には「(1)引数の数」と「(2)修飾子」「(3)型」が異なっていれば関数に同じ名前を付けられるようになっている。大域関数で可能な多重定義はメンバー関数で全て可能である。メンバー関数は更に「(4)修飾子の違い」による多重定義と変換演算子を用いた時に限り可能な「(5)戻り値の型の違い」による多重定義が可能になっている。JavaやC#などC++以外の言語では(1)と(3)の範囲にとどまっている事が多い。C++で特に特徴的なのは※1の省略子と※2のテンプレート関数を多重定義できる点である。省略子を引数にとる関数はあらゆる引数を受け付ける関数である。引数の型や数を無視する反面、関数の内部では一切引数を参照することができない。テンプレート関数はint等明示的に型を書いた関数より選択される優先度が低く、省略子を用いた関数は更に低い。この特性を利用して同じ扱いで処理できる型はテンプレート関数で処理、特別扱いが必要な型であれば明示的に型を書いた関数で処理、引数の数が異り多重定義した関数群では対処しようがない引数は省略子を用いた関数を使って何もしない等既定の処理をさせるようにすることができる。Function1をFunctionとして定義。FORTRANに予約語はなくFunctionは予約語ではない。Example特徴的なのは関数の定義としては多重定義を認めないものの呼び出し方法として多重定義を認めている点である。呼び出し時の名前と定義の名前は別物であるため混乱の原因となるだけではあるが全く別の名前をつける事も可能になっている。演算子の多重定義[編集]多重定義を使った利用者定義演算子の一種である。詳細は当該記事を参照のこと。オブジェクト指向言語においては数値型とオブジェクトを同じ関数で処理するために必須の機能である(後述のテンプレートと多重定義参照)。テンプレートと多重定義[編集]C++の様に多重定義とテンプレートを使用可能な言語では、両方の機能を組み合わせることにより静的な多態を実現することができる。PostgreSQLのストアドプロシージャーの様なテンプレートを備えていない言語でも同様の多態を実現できる場合がある。1または0を返す関数。※absを使用しているため、引数に指定できる値の値の範囲はこの関数の引数と同じ型(反変な型)をとるabsの仕様に依存する。※double用に<cmath>と<cstdlib>のincludeが必要。EXIT_SUCCESS;}この例ではSign関数内部の演算子とabs関数がSign関数の引数に指定した値によって変化する。対して適用することもできる。その場合、結果は正規化された複素数(正規化ベクトル)となり、符号関数の複素数への拡張に一致する。この様にテンプレートと多重定義を備える言語では、多重定義でオーバーライドを代用することができる。多重定義による多態は、コンパイル時にしか実現できないという問題があるものの単純なオーバーライドでは実現しづらい各種柔軟性を備えている。メンバー関数だけでなく大域スコープの関数をクラスのインターフェースの一部として見做す事が出来るようになる。これにより、単に手続き型の要素でしか無かった大域スコープの関数をオブジェクト指向機能の一要素として組み入れる事が出来る。大域スコープの関数がインターフェースとして機能し始める事によりクラスだけでなく、intやdouble型といったメンバー関数を持てない型にもオブジェクト指向の恩恵が得られる様になるのである。次に、大域スコープの関数は直接クラスに所属しないという特性によりメンバー関数より柔軟な拡張性を得る事が出来る。外部のライブラリーのあるクラスにメンバー関数を追加することは、外部のライブラリーに手を加えなければいけないため事実上無理である。それに対し大域スコープの関数を追加する場合は、外部のライブラリーに手を加える必要がなく容易である。関数をテンプレートで実装すれば複数のクラスを横断的に拡張できる。先にテンプレート関数が存在する場合や、拡張対象のクラスの親クラスに対する関数が存在する場合、新たに、より具体的な型を引数に取る関数を追加することで静的なオーバーライドが可能となる。次に、単一ディスパッチでは不可能な多重ディスパッチを模倣できるという点がある。これにより、例えば矩形を描画しようとする際、描画先デバイスが矩形の描画に対応していれば、デバイスに直接矩形情報を送り、描画先デバイスが矩形描画に対応していなければ、パスや線分等その他の機能を使って矩形を描画するといった処理が自然な形で記述可能となる。大域スコープと記述しているが名前空間の中にあっても次の例のように多態性の実現は可能である[13]。この仕組みを実引数依存の名前探索という。おいて何らかの数値型例えば有理数型のためのクラスを定義するとして、整数型を引数にとるabs関数が絶対値を返すにもかかわらず有理数型をとるabs関数を全く違う意味で定義すると関数テンプレートなどで同じ処理を共有できないばかりでなく混乱を招く。互換性の無い多重定義は避けるべきである。曖昧な型を持つ言語[編集]PerlやPHPのような曖昧な型を持つ言語では、関数の多重定義ができない、あるいは制限されていることがある。そのときは関数の先頭で引数の型を判定する条件分岐で対応する。PHPには「オーバーロード」という機能が存在するが、これはプロパティやメソッドを動的に作成するための機能であり、他の多くのオブジェクト指向言語とは異なる意味で用いられている。2014年4月16日閲覧。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。