next up previous
: 仮想関数 : 仮想関数と多態 : 仮想関数と多態

多態とは

同じインターフェースを 異なる型のデータに対して使えると便利である.

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++ はこの概念を実現している.



Takeshi Kumagai 平成19年6月19日