オブジェクト指向におけるメソッドのうち、動作内容を変更できるものを指します。
詳細はプログラミング言語によって異なりますが、一般に、クラス内で宣言されたメソッド(特にインスタンスメソッド)のうち、派生クラスの側でオーバーライドして、新しい動作を記述できるものを指します。「virtual」などのキーワードを付加して宣言することによって、仮想メソッドであることを明示する必要がある言語や、特に何もせずともデフォルトで仮想メソッドになる言語もあります。
仮想メソッド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
がどのクラスからインスタンス化されたものであるかによって、起動するメソッドが選ばれていることを意味します(多態性)。
仮想メソッドのうち、実装を持っておらず、オーバーライドされることを前提としているものを抽象メソッドと呼びます。抽象メソッドは、ここで挙げた仮想メソッドとはまた違った方法で宣言されます(たとえば「virtual」に代わり、「abstract」キーワードを用いるなど)。
C++ では仮想関数と呼ばれ、virtualキーワードを付加して宣言されたメンバ関数のことを指します。派生クラスの側でオーバーライドすることができます。
仮想関数については、C++編【言語解説】第27章を参照してください。
C++11 以降では、オーバーライド時に overrideキーワードを付加できるようになっており、誤ったオーバーライド(仮想関数でないものをオーバーライドしようとしている、シグネチャが一致しないなど)をコンパイル時に検知できるようになりました。また、オーバーライドを不許可にする finalキーワードも C++11 で追加されています。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |