オーバーロードは、名前の同じ関数や手続きの存在が許可されることを言います。例を見て見ましょう。
function MyFunc(i, j: Integer): Integer; overload; begin ShowMessage('1番です'); Result := i + j; end; function MyFunc(i: Integer; j: Double): Double; overload; begin ShowMessage('2番です'); Result := i + j; end; function MyFunc(i: Double; j: Integer): Double; overload; begin ShowMessage('3番です'); Result := i + j; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; d: Double; begin i := MyFunc(10, 10); ShowMessage(IntToStr(i)); d := MyFunc(2, 3.3); ShowMessage(FloatToStr(d)); d := MyFunc(4.2, 3); ShowMessage(FloatToStr(d)); end;
関数の後ろに overload を付けてやればオーバーロードすることが出来ます。それぞれをどのように判断しているのかというと、それは引数で判断されています。 引数の数、型で違いを付けてやればコンパイラはどの関数、手続きを使えばよいのかを判断できます。
また、オーバーロード関数でデフォルト引数を使用すると、あいまいさが生じることがあります。
function MyFunc(i: Integer): Integer; overload; begin Result := i * i; end; function MyFunc(i: Integer; j: Integer = 0): Integer; overload; begin Result := i * j; end; procedure TForm1.Button1Click(Sender: TObject); begin MyFunc(2, 3); MyFunc(5); // あいまい end;