オブジェクト指向プログラミングにおいて、スーパークラスのメソッドを、サブクラスの側で定義しなおして、動作を変更することです。
詳細はプログラミング言語によって異なりますが、あるクラスで定義されているメソッドを、サブクラスの側で再定義することを指しています。オーバーライドが可能であるためには、スーパークラス側のメソッドが仮想メソッドでなければなりません。
実装がない抽象メソッドに実装を与えるために、サブクラス側で定義を記述することもオーバーライドです。
スーパークラスの側でのシグネチャと、サブクラス側でのシグネチャが一致していなければならないという制約をもつ言語が多いですが、いくらか制約が緩いケースもあります。
仮想メソッドf を持つクラスA を継承し、サブクラスB で f
をオーバーライドしたとします。ここで、たとえば
A a = new A()
のようにしてインスタンス化されたオブジェクトa による a.f()
は当然、クラスA の f を起動します。B b = new B()
として、b.f()
とするとクラスB の f
が起動します。一方で、クラスB のオブジェクトを A
として扱った場合(A x = new B()
)、x.f()
はクラスB の f を起動します。A x = new A()
としていたのなら、x.f()
という同じコードから、クラスA の f
が起動されます。この振る舞いは、x の型がどうであるかではなく、x
がどのクラスからインスタンス化されたものであるかによって、起動するメソッドが選ばれていることを意味します。このような動作は多態性という性質によるものです。
C++ では virtualキーワードを付加して宣言された仮想関数を、派生クラス側で再定義することでオーバーライドできます。
仮想関数とオーバーライドについては、C++編【言語解説】第27章を参照してください。
C++11 以降では、オーバーライド時に overrideキーワードを付加できるようになっており、誤ったオーバーライド(仮想関数でないものをオーバーライドしようとしている、シグネチャが一致しないなど)をコンパイル時に検知できるようになりました。また、オーバーライドを不許可にする finalキーワードも C++11 で追加されています。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |