仮想メソッド | Programming Place Plus 用語集

トップページ用語集

名称 🔗

解説 🔗

オブジェクト指向におけるメソッドのうち、動作内容を変更できるものを指します。

詳細はプログラミング言語によって異なりますが、一般に、クラス内で宣言されたメソッド(特にインスタンスメソッド)のうち、派生クラスの側でオーバーライドして、新しい動作を記述できるものを指します。「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++ の場合

C++ では仮想関数と呼ばれ、virtualキーワードを付加して宣言されたメンバ関数のことを指します。派生クラスの側でオーバーライドすることができます。

仮想関数については、C++編【言語解説】第27章を参照してください。

C++11 以降では、オーバーライド時に overrideキーワードを付加できるようになっており、誤ったオーバーライド(仮想関数でないものをオーバーライドしようとしている、シグネチャが一致しないなど)をコンパイル時に検知できるようになりました。また、オーバーライドを不許可にする finalキーワードも C++11 で追加されています。


参考リンク 🔗

更新履歴 🔗


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る