同じインターフェースを 異なる型のデータに対して使えると便利である.
3 つの変数の最大値を求めることを考える.
C では,
変数の型を int
とすると,
int max_for_int(int a, int b, int c) { return (a >= b) ? ((a >= c) ? a : c) : ((b >= c) ? b : c); }となる.また,
double
の変数に対しても
最大値を求める関数を用意するとなると,
max_for_int
に加えて,
double max_for_double(double a, double b, double c) { return (a >= b) ? ((a >= c) ? a : c) : ((b >= c) ? b : c); }を定義することになる. このように似た概念をもつ,いろいろな型に対する関数を用意する必要がある.
C では, これを避けるために,マクロを定義する方法もある.
#define max(a, b, c) ((a) >= (b)) ? (((a) >= (c)) ? (a) : (c)) \ : (((b) >= (c)) ? (b) : (c))マクロを使用すると複雑な定義となることが多く, 引数として副作用のあるものが渡された場合, 関数で定義された場合とは異なる動作をする, などの問題がある.
つまり,同じ概念の動作を同じ名前の関数などのインタフェースで実現する ことが望ましい. そこで C++ では関数のオーバロード機能を設け,引数の型に応じて 複数のメソッドを使い分ける機能が盛り込まれている. また,演算子をオーバロードできるため, さらに強力になっている.
このように,1 つの名前を複数の目的に使用することを 多態 (polymorphism) という. C++ はこの概念を実現している.