仮想関数テーブル
仮想関数テーブル(かそうかんすうテーブル、英: virtual method table)あるいはvtableは、プログラミング言語の実装において動的なポリモーフィズム、すなわち実行時のメソッドの束縛を実現するために用いられる機構である。
あるプログラムが、継承関係にある複数のクラス(データ型)を持っているとする。たとえばスーパークラス Cat と二つのサブクラス HouseCat と Lion において、クラス Cat が speak という仮想関数(仮想メソッド)を定義しており、サブクラスは適切な実装(鳴く、吠えるといった)を行うものとする。
プログラムがspeakメソッドをCatへのポインタp(Cat クラスおよび Cat の任意のサブクラスを指すことができる)に対して呼び出すと、実行環境は、pが指す実際のオブジェクトの種類(型)に応じてどの実装を呼び出すかを決定しなければならない。
このような動的な割り当てを実現するには様々な方法があるが、C++および関連するプログラミング言語(D言語、Java、C#など)では、vtableによる方法が一般的である。
オブジェクトのインターフェイスを実装から分離する言語(Visual Basic や Delphi など)でも、異なるメソッドポインタの集合を用いるだけで、異なる実装をオブジェクトが使用できるため、vtable による方法を採用する傾向にある。
C言語はオブジェクト指向プログラミングの機能を言語仕様としてサポートしないが、関数ポインタを利用することで仮想関数を模倣することができる。
g++ コンパイラはクラス D の B1 と B2 からの多重継承を、基底クラスごとに一つずつの、二つの仮想関数テーブルを用いて実現する(多重継承を実現するには他にも方法があるがこれが最も一般的である)。これにより、キャストの際 "pointer fixups" (thunk) が必要になる。
下記のような C++ コードを考える:
d と b1 が実行時に同じメモリ位置を参照するが、 b2 は d+8(d のメモリ配置の8バイト後方)を示す。 そのため、b2 は d 内の B2 らしく見える領域、 すなわち B2 のインスタンスと同じメモリレイアウトを持つ部分を示す。