5

データ構造にグループ化された一連の関数ポインターは、多くの場合、仮想関数テーブル (VFT) と呼ばれます。

上記のステートメントは私にそれを感じさせvirtual function == function pointerます、そうですか?

4

7 に答える 7

5

C には仮想関数の組み込みサポートはありません。

C++ では、仮想関数はv-tableを介して指定されます。また、vtable のエントリは関数ポインタとして実装できます。

于 2010-05-23T12:43:37.373 に答える
2

これらは異なるレベルの抽象化であるため、それは間違っています。

仮想関数と関数ポインターが同一であると言うのは、車輪とバイクが同一であると言うようなものです。

関数ポインターと仮想関数が「内部では」ほとんど同じように見えることは事実ですが、それらは概念的には異なります (仮想関数はクラスのオーバーライド可能なメンバー メソッドですが、関数ポインターは単に関数の間接的なものです)。 )および構文的に(それらの呼び出しは完全に異なります)。

ただし、それらは同じ目的に役立つ場合があります。特に、どちらも呼び出しの決定 (この状況でどの関数を呼び出すか) を、コンパイル時に通常の呼び出しのディスパッチが行われる実行時まで延期する手段を提供します。

于 2010-05-23T12:47:55.493 に答える
1

近いと言えますが、完全ではありません。仮想関数も関数ですが、通常は直接ではなくポインターを介して呼び出されます。

于 2010-05-23T12:43:12.270 に答える
1

実は C++ は Virtual Functions をサポートしていますが、C は VF をサポートしていません。両者はまったく異なる概念だからです。

于 2010-05-23T13:56:49.083 に答える
1

定義によるC++の仮想関数virtualは、キーワードで宣言された関数です(すぐに、または基本クラスの1つで)。それで全部です。

現在、仮想関数の呼び出しは静的または動的に解決できます。動的に解決された呼び出しは、呼び出しで使用されるオブジェクトの動的な型に従って解決された呼び出しです。それで全部です。

上記には、「関数ポインタ」への参照はありません。ただし、動的呼び出しの適切な動作を実装するための一般的な実装では、関数ポインタ (仮想関数を指す) を持つテーブルが使用されます。このテーブルは、「VMT」、「VFT」、または「vtable」と呼ばれるものです。

つまり、関数ポインタは、仮想関数への動的呼び出しのサポートを提供するために通常使用される実装の詳細です。

さらに詳しく説明すると、たとえば、一部の関数が virtual であるが、 dynamic と呼ばれることがない場合でも、その関数の「ポインター」を生成する必要がないことに注意してください。このため、一部のコンパイラは抽象クラスの VMT を生成しません。これは、これらのクラスに仮想関数があっても、これらの関数が動的に呼び出されることはないためです。

于 2010-05-23T17:14:39.867 に答える
1

はい、仮想関数テーブルは、関数ポインターのテーブルとして内部で実装されることがよくあります。ただし、関数を実際に「仮想」にするために、ポインターのテーブルと一緒に使用する他のハードウェアもあります。実行時に呼び出しを正しいポインターにバインドするためのメカニズムを用意する必要があります。これは、仮想関数が最も基本的なレベルの関数ポインターであるため、仮想関数が作成されると考えるのは間違っているためです。仮想関数を指す任意の関数。

于 2010-05-23T13:02:37.393 に答える
0

私はそれが Linux Network Internals の本からのものだと推測しました -- ここでは C について話しているのですが、括弧が間違っています --virtual (function table)ではなく(virtual function) table:) です。仮想関数は C++ のみの用語です。

これは、ANSI C で OOP をコーディングできないという意味ではありません...

于 2010-05-23T12:49:20.383 に答える