メソッドのオーバーロードとオーバーライド

オブジェクト指向プログラミング(OOP)におけるクラス設計に関して、「メソッドのオーバーロード(Overload)」と「メソッドのオーバーライド(Override)」は、重要な多態性(ポリモーフィズム)の実現手段です。これらは見た目が似ていますが、目的や適用範囲が異なるため、区別して理解することが重要です。


1. メソッドのオーバーロード(Overload)

概要:

同じメソッド名でありながら、引数の数や型が異なる複数のメソッドを1つのクラス内に定義すること。

目的:

同じ機能的な処理を異なる引数の形式で提供したい場合に使用される。これにより、呼び出し側の利便性が高まり、コードの可読性と保守性が向上する。

条件:

  • メソッド名が同じ

  • 引数の「数」または「型」が異なる

  • 戻り値の型が異なるだけではオーバーロードにはならない

例(C++やJava):

cpp
class Calculator { public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } };

2. メソッドのオーバーライド(Override)

概要:

親クラス(基底クラス)で定義されたメソッドを、子クラス(派生クラス)で再定義すること。

目的:

親クラスから継承されたメソッドの動作を、子クラス特有の処理に変更したいときに使用される。**動的バインディング(実行時ポリモーフィズム)**を実現するための仕組み。

条件:

  • メソッド名が同じ

  • 引数の型と数が親クラスと完全に一致

  • 戻り値の型も互換性がある必要がある(Javaでは共変戻り値が許される)

  • 通常はvirtual(C++)やoverride(C++11以降、C#)などのキーワードを使用

例(C++):

cpp
class Animal { public: virtual void speak() { std::cout << "Some sound" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark" << std::endl; } };

オーバーロードとオーバーライドの違い

比較項目 オーバーロード オーバーライド
適用対象 同じクラス内のメソッド 親クラスと子クラス間のメソッド
メソッド名 同じ 同じ
引数の型・数 異なる必要がある 親クラスと完全一致
戻り値の型 異なってもよい 一致または互換である必要がある
実行時の振る舞い 静的バインディング(コンパイル時) 動的バインディング(実行時)
ポリモーフィズムとの関係 間接的(利便性向上) 直接的(実行時ポリモーフィズム実現)

まとめ

  • オーバーロードは「引数の違いによる多様な呼び出し」を可能にし、同じクラス内で使われます。

  • オーバーライドは「継承関係における動作の置き換え」を目的とし、**異なるクラス間(親子関係)**で使われます。

どちらも適切に使うことで、オブジェクト指向プログラミングの設計が柔軟かつ拡張性のあるものになります。

生成日:2025/06/01