多重定義
多重定義を使った利用者定義演算子の一種である。詳細は当該記事を参照のこと。
オブジェクト指向言語においては数値型とオブジェクトを同じ関数で処理するために必須の機能である(後述のテンプレートと多重定義参照)。
関数/メソッドおよび演算子が多重定義された場合、その名前だけで区別することができないので、多重定義の候補のうち、どのバージョンが使われるのかがソースコード上で一見して分かりづらく、可読性が下がる。統合開発環境 (IDE) の中には、構文解析によりどのバージョンがどこで使われているかを列挙してくれるものも存在するが、そういったツールが使えない状況では読み手に詳細なルックアップの知識がないと判別が困難なこともある。
次に、大域スコープの関数は直接クラスに所属しないという特性によりメンバー関数より柔軟な拡張性を得る事が出来る。例えば、外部のライブラリーのあるクラスにメンバー関数を追加することは、外部のライブラリーに手を加えなければいけないため事実上無理である。それに対し大域スコープの関数を追加する場合は、外部のライブラリーに手を加える必要がなく容易である。また、関数をテンプレートで実装すれば複数のクラスを横断的に拡張できる。先にテンプレート関数が存在する場合や、拡張対象のクラスの親クラスに対する関数が存在する場合、新たに、より具体的な型を引数に取る関数を追加することで静的なオーバーライドが可能となる。
次に、単一ディスパッチでは不可能な多重ディスパッチを模倣できるという点がある。これにより、例えば矩形を描画しようとする際、描画先デバイスが矩形の描画に対応していれば、デバイスに直接矩形情報を送り、描画先デバイスが矩形描画に対応していなければ、パスや線分等その他の機能を使って矩形を描画するといった処理が自然な形で記述可能となる。
なお大域スコープと記述しているが名前空間の中にあっても次の例のように多態性の実現は可能である。この仕組みを実引数依存の名前探索という。