|
仮想関数テーブル(かそうかんすうテーブル、)あるいはvtableは、プログラミング言語の実装において動的なポリモーフィズム、すなわち実行時のメソッドの束縛を実現するために用いられる機構である。 あるプログラムが継承関係にある複数のクラスを持っているとする。たとえばスーパークラス Cat と二つのサブクラス HouseCat と Lion において、クラス Cat が "speak" という仮想関数を定義しており、サブクラスは適切な実装(鳴く、吠えるといった)を行うものとする。プログラムが "speak" メソッドを Cat ポインタ(Cat クラスと Cat の任意のサブクラスを示すことができる) に対して呼び出すと、実行環境は、Cat が示す実際のオブジェクトの種類に応じてどの実装を呼び出すかを決定しなければならない。 このような動的な割り当てを実現するには様々な方法があるが、vtable による方法が C++ や関連するプログラミング言語(D言語 や C# など)では一般的である。 実用的なオブジェクトのインターフェイスを実装と分離する言語(Visual Basic や Delphi など)でも、オブジェクトが異なる関数ポインタのセットを用いるだけで異なる実装を用いることができるため、vtable による方法を用いる傾向にある。 ==vtable の実装== :オブジェクトのディスパッチテーブルはオブジェクトの動的にバインドされるメソッドのアドレスを保持する。メソッドの呼び出しは、メソッドのアドレスをオブジェクトのディスパッチテーブルから取り出すことにより行われる。ディスパッチテーブルは同じクラスに属するオブジェクトでは全て同一であり、通常オブジェクトから共有される。互換性のある型のオブジェクト(継承関係において兄弟のもの)は同じレイアウトのディスパッチテーブルを持ち、あるメソッドのアドレスは、全ての型互換のクラスの中で常に同じオフセットに現れる。それゆえ、メソッドのアドレスをディスパッチテーブルから取り出すことで、オブジェクトの実際のクラスに対応したメソッドが得られる。 :(Ellis & Stroustrup 1990, pp. 227–232) C++ の標準では、動的なディスパッチがどのように実装されるべきかについて規定していないが、一般的にコンパイラは若干の変更を加えて共通の基本的なモデルを用いる。 典型的には、コンパイラは各クラスごとに別の vtable を作成する。オブジェクトが生成される際、vtable に対するポインタ、仮想テーブルポインタ, vpointer, vptr がオブジェクトの不可視のメンバーとして追加される(通常は最初のメンバーとなる)。コンパイラはコンストラクタ内に"隠れた"コードを生成し、クラスのオブジェクトの vpointer が、対応する vtable のアドレスで初期化されるようにする。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「仮想関数テーブル」の詳細全文を読む 英語版ウィキペディアに対照対訳語「 Virtual method table 」があります。 スポンサード リンク
|