同じインターフェースを 異なる型のデータに対して使えると便利である.
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++ はこの概念を実現している.