仮想関数【virtual function】仮想メソッド/virtual method
概要

クラスを構成するメンバ関数として定義されるが、サブクラスで同じ名前・引数・返り値型の関数を宣言し直すことができる。この上書きを「オーバーライド」(override)という。C++では関数宣言にvirtualキーワードを付けることで仮想関数として定義する。
仮想関数はスーパークラス(基底クラス)側にも実装を持つ。サブクラスでオーバーライドされなかった場合はスーパークラスの実装がそのまま引き継がれ、オーバーライドされた場合はサブクラス側の実装が優先される。
仮想関数の核心は「動的ディスパッチ」(動的束縛)にある。スーパークラスのポインタや参照を通じてメンバ関数を呼び出した場合、コンパイル時の宣言型ではなく実行時の実際のオブジェクトの型に基づいて呼び出す関数が選択される。これにより、呼び出し側はオブジェクトの具体的なクラスを意識せず共通のインターフェースで操作できる。この性質を「ポリモーフィズム」(多態性)と言い、仮想関数はその実現手段となっている。
C++にはさらに「純粋仮想関数」(pure virtual function)という形式もある。「virtual 関数名() = 0;」と宣言するもので、スーパークラス側に実装を持たず、サブクラスでの実装を強制する。純粋仮想関数を一つでも含むクラスは「抽象クラス」(abstract class)となり、それ自体はインスタンス化できない。他の言語では同様の機能を「抽象メソッド」(abstract method)と呼ぶことが多い。
C#では仮想関数に相当するものを「仮想メソッド」(virtual method)と呼び、やはりvirtual修飾子で宣言する。サブクラスではoverride修飾子を付けてオーバーライドすることができる。JavaやPythonではメンバ関数が原則として動的ディスパッチで動作するため、仮想関数に相当する特別な宣言は不要である。