26

封印されたクラスについて説明するとき、「仮想関数テーブル」という用語が頻繁に言及されます。これは正確には何ですか?私は少し前にメソッドテーブルについて読みました(これの目的の目的も覚えていません)、そしてここでグーグル/検索はC++関連の結果をもたらします。

ありがとう

4

3 に答える 3

32

「仮想関数テーブル」または「仮想メソッドテーブル」は、各クラスが持つメソッドポインタのリストです。これには、クラス内の仮想メソッドへのポインターが含まれています。

クラスの各インスタンスには、インスタンスから仮想メソッドを呼び出すときに使用されるテーブルへのポインターがあります。これは、仮想メソッドの呼び出しでは、オブジェクトへの参照のクラスではなく、実際のオブジェクトのクラスに関連付けられたメソッドを呼び出す必要があるためです。

たとえば、文字列へのオブジェクト参照がある場合:

object obj = "asdf";

仮想メソッドToStringを呼び出します。

string text = obj.ToString();

Object.ToStringメソッドではなく、String.ToStringメソッドを使用します。Objectクラスの仮想メソッドテーブルではなく、Stringクラスの仮想メソッドテーブル(文字列インスタンスのポインタが指している)を使用しています。

于 2010-03-09T23:50:51.240 に答える
7

C#仮想関数テーブルは基本的にC ++のものと同じように機能するため、C ++仮想関数テーブルがどのように機能するかを説明するリソースは、C#のものでも非常に役立ちます。

たとえば、ウィキペディアの説明は悪くありません。

于 2010-03-09T23:46:46.147 に答える
2

仮想関数テーブル(多くの場合、vtableと呼ばれる)の定義は、C#とC++で同じです。これは、抽象/仮想/オーバーライドメソッドのポリモーフィックな動作を実現するためにランタイムによって内部的に使用されるルックアップテーブルです。

簡単に言えば、仮想methodAを持つ基本クラスがmethodAを含むvtableを持つことを想像できます。派生クラスがmethodAをオーバーライドすると、methodAのvtableは親クラスから継承しますが、親クラスではなく派生クラスのmethodAを指すようになります。

于 2010-03-09T23:49:25.413 に答える