仮想メソッドは、仮想メソッドテーブル(VMT)を使用して実装されます。クラスごとに1つのVMTがあります。VMTには、クラス内の仮想メソッドごとに1つのエントリが含まれています。そして、そのエントリはメソッドのアドレスです。
これにより、非常に効率的な呼び出しが可能になります。から固定オフセットにあるVMTのアドレスを取得するだけですSelf
。次に、インデックスでメソッドポインタを検索し、メソッドを呼び出します。
これが意味するのは、多くの仮想メソッドを持つクラスがあり、サブクラスを派生させる場合、すべての仮想メソッドを持つまったく新しいVMTを作成するということです。そして、それらの多くをオーバーライドしていない場合は、VMTに多くのオーバーラップがあることがわかります。
これは16ビットの時代には問題でした。VMTは、実行可能イメージで多くのスペースを占有する可能性があり(これは、コードサイズの意味です)、VMTのスペースが不足する可能性があります。そこで、動的な方法が導入されました。VMTに類似しているのは、動的メソッドテーブルDMTです。これは、メソッドがオーバーライドされない場合の繰り返しを回避するために、異なる方法で実装されます。欠点は、動的メソッドの呼び出しがより高価になることです。
現代では、32ビット以降、特にDelphiが生成する非常に太い実行可能ファイルでは、これらのサイズの問題は問題になりません。したがって、すべての適切なアドバイスは、仮想メソッドを排他的に使用することです。
仮想メソッドテーブルの実装はよく理解されており、それらを理解するための多くのリファレンスを見つけることができます。かなり趣のある動的メソッドの場合はそれほどではありません。私が見つけた最高の情報源は、HallvardVassbotnのブログからです。