単なるコンパイルされたポインタへのジャンプである非仮想関数の呼び出しに対して、仮想関数の呼び出しは最低一度以上、余分にポインタをたどる操作や"fixup" が必要である。そのため、仮想関数の呼び出しは原理的に非仮想の関数呼び出しに対して低速である。実験によれば 6-13% の実行時間が単なる関数のディスパッチに用いられ、オーバーヘッドは場合によって 50% に達する。さらに、 JIT コンパイルが使用できない環境では、仮想関数は通常インライン展開できない。テーブルの参照を行う部分を、たとえばインライン化された本体部分を条件文で実行させることも可能ではあるが、そうした最適化は一般的ではない。オーバーヘッドを避けるため、コンパイラはコンパイル時に呼び出しが解決できる場合には vtable の生成を行わない。従って、上記の f1 の呼び出しは、 d が現時点で D のみ保持しており、D が f1 をオーバーライドしないことをコンパイラが判断できるため、vtable の検索は必要なくなる可能性がある。コンパイラ（あるいは最適化プログラム）はプログラム内に f1 をオーバーライドする B1 のサブクラスがないことを検出することができるかもしれない。実装が明示的に指定されているため(this ポインタの fixup が必要ではあるが） B1::f1 ないし B2::f2 はおそらく vtable の検索を必要とすることはない。
呼び出しの際には、d->f1() の呼び出しの際は、d の D::B1 vpointer をたどり、vtable から f1 のエントリーを調べ、ポインタを取り出してコードを呼び出す。単一継承(あるいは、単一継承のみ可能な言語)の場合、vpointer が常に d の最初の要素にあれば（多数のコンパイラでそうなっている）、下記のような擬似 C++ のコードに簡略化できる。*((*d)[0])(d)より一般的なケースでは、上記のようなdの f1()、D::f2()、B2::f2() 呼び出しはより複雑なものとなる。*((d->/* Dの(B1用の)仮想関数テーブルへのポインタ*/)[0])(d)*((d->/* Dの(B1用の)仮想関数テーブルへのポインタ*/)[12])(d)*((d->/* Dの(B2用の)仮想関数テーブルへのポインタ*/)[0])(d+8)これに対して、d->f0() の呼び出しはもっと単純である：*B1::f0(d)
g++ コンパイラはクラス D の B1 と B2 からの多重継承を、基底クラスごとに一つずつの、二つの仮想関数テーブルを用いて実現する(多重継承を実現するには他にも方法があるがこれが最も一般的である)。これにより、キャストの際 "pointer fixups" (thunk) が必要になる。下記のような C++ コードを考える:D  *d  = new D();B1 *b1 = dynamic_cast<B1*>(d);B2 *b2 = dynamic_cast<B2*>(d);d と b1 が実行時に同じメモリ位置を参照するが、 b2 は d+8 (d のメモリ配置の 8バイト後方)を示す。 そのため、b2 は d 内の B2 らしく見える領域、 すなわち B2 のインスタンスと同じメモリレイアウトを持つ部分を示す。
仮想関数テーブル（かそうかんすうテーブル、英: virtual method table）あるいはvtableは、プログラミング言語の実装において動的なポリモーフィズム、すなわち実行時のメソッドの束縛を実現するために用いられる機構である。あるプログラムが継承関係にある複数のクラスを持っているとする。たとえばスーパークラス Cat と二つのサブクラス HouseCat と Lion において、クラス Cat が "speak" という仮想関数を定義しており、サブクラスは適切な実装（鳴く、吠えるといった）を行うものとする。プログラムが "speak" メソッドを Cat ポインタ（Cat クラスと Cat の任意のサブクラスを示すことができる) に対して呼び出すと、実行環境は、Cat が示す実際のオブジェクトの種類に応じてどの実装を呼び出すかを決定しなければならない。このような動的な割り当てを実現するには様々な方法があるが、vtable による方法が C++ や関連するプログラミング言語（D言語 や C# など）では一般的である。実用的なオブジェクトのインターフェイスを実装と分離する言語（Visual Basic や Delphi など）でも、オブジェクトが異なる関数ポインタのセットを用いるだけで異なる実装を用いることができるため、vtable による方法を用いる傾向にある。
ゾルディン条約（ゾルディンじょうやく、ドイツ語: Vertrag von Soldin）は1309年9月13日、ゾルディン（現ポーランド領ミシュリブシュ）にてブランデンブルク＝シュテンダル辺境伯ヴァルデーマルとドイツ騎士団の間で締結された条約。1308年、ドイツ騎士団はダンツィヒ近くの要塞に駐留軍を1年間置く許可の代わりに、ポーランド軍によるダンツィヒの奪回（ダンツィヒは当時ブランデンブルク領）の援助を約束した。しかし、ダンツィヒ包囲の最中、協定における要塞の大きさをめぐってドイツ騎士団とポーランドの間で争いがおこり、ポーランド軍は攻撃されて短期間囚われた後、包囲から撤退した。結局、ダンツィヒ包囲戦はドイツ騎士団の勝利に終わったが、騎士団はダンツィヒの住民を惨殺した後、ダンツィヒをそのまま占拠した。しかし、ドイツ騎士団にはダンツィヒを占拠する法的根拠がなかった。そのため、騎士団はダンツィヒ、およびポメレリアの大半（ティチェフ/ドイツ語名ディルシャウ、シュフィエチェ/ドイツ語名シュヴェーツ、およびその後方の領土）の領有権をブランデンブルクから1万銀マルクで買い上げた。ただし、ブランデンブルクによるダンツィヒ近辺への請求自体の法的根拠は疑わしいものだった。神聖ローマ皇帝の候補ハインリヒ7世は1311年にゾルディン条約を確認したが、ポーランドは度々疑問を呈し、ポーランド・ドイツ騎士団戦争を引き起こす結果となった。ポーランド王は1343年のカリシュ条約でようやくこの領土変更を承認した。条約により、ドイツ騎士団はダンツィヒを通して、バルト海への出口があるヴィスワ川下流を支配し、さらに神聖ローマ帝国への道をも得た。条約が締結された同年にドイツ騎士団の総部がウィーンからマリエンブルク（現ポーランド領マルボルク）へ移された。