仮想メソッドは、仮想メソッドテーブル(VMT)で実装されています。クラスごとに1つのVMTがあります。 VMTには、クラス内の仮想メソッドごとに1つのエントリが含まれています。そのエントリはメソッドのアドレスです。
これにより、非常に効率的な呼び出しが可能になります。 Self
からの固定オフセットに位置するVMTのアドレスを取得するだけです。次に、メソッドポインタをインデックスで検索し、メソッドを呼び出します。
これは、仮想メソッドがたくさんあるクラスがあり、サブクラスを派生させた場合、すべての仮想メソッドで新しいVMTを作成するということです。そして、あなたがそれらの多くをオーバーライドしていなければ、VMTには多くのオーバーラップがあることがわかります。
これは16ビット時代の問題でした。 VMTは、実行可能イメージ(コードサイズの意味)に多くの領域を占有し、VMTの領域を使い果たす可能性があります。ダイナミックなメソッドが導入されました。 VMTのアナログは、動的メソッドテーブルDMTです。これは、メソッドがオーバーライドされないときの繰り返しを避けるために、別の方法で実装されています。欠点は動的メソッドを呼び出すほうが高価だということです。
現代では、32ビット、特にデルファイが生成する非常に実行可能な実行ファイルであるため、これらのサイズの問題は問題になりません。そして、すべての忠実なアドバイスは、仮想メソッドを排他的に使用することです。
仮想メソッドテーブルの実装はよく理解されており、それらを理解するための参照が多数見つかります。それはあまり風変わりではないダイナミックな方法にとってはそうではありません。私が見つけた最良の情報源はHallvard Vassbotnのブログからです:
2重引用符は、あなたが知っておくべきことを教えてくれ。ボトムラインは、私の見解では、常に仮想を使用しています。 –
@DavidHeffernan投稿編集されました! – EProgrammerNotFound