9

vtable には、そのクラスの仮想関数へのポインターが含まれます。非仮想関数へのポインタも含まれていますか?

どうも!

4

4 に答える 4

11

これは実装の詳細ですが、いいえ。実装が非仮想関数へのポインターを vtable に配置した場合、これらのポインターを使用して関数呼び出しを行うことができませんでした。

非仮想関数が呼び出される場合、実装では、関数が呼び出されるオブジェクトの静的型使用して、呼び出す正しい関数を決定する必要があります。vptrによってアクセスされるvtableに格納された関数は、オブジェクトの動的な型に依存し、アクセスされる参照またはポインターの静的な型には依存しません。

于 2012-09-30T12:41:09.603 に答える
4

いいえ、そうではありません。

非仮想メソッドの呼び出しはコンパイル中に解決できるため (コンパイラは非仮想関数のアドレスを認識しているため)、コンパイラはそれらを「直接」(つまり静的に) 呼び出す命令を生成します。

コンパイル時に既知のメソッドに対して vtable インダイレクション メカニズムを使用する理由はありません。

于 2012-09-30T12:41:26.670 に答える
2

「vtable」が実装で使用されるかどうかは、標準では定義されていません。ほとんどの実装では、関数ポインターのテーブルを使用しますが、通常、指し示される関数は直接呼び出されるものではありません (代わりに、指し示される関数は、実際の関数を呼び出す前にポインターを調整する場合があります)。

非仮想関数がこの表に表示されるかどうかも、標準では定義されていません。結局のところ、標準では vtable の存在さえ必要としません。通常、非仮想関数は仮想関数テーブルにはありません。これは、必要なポインターの調整と呼び出しはコンパイル時またはリンク時に解決できるためです。すべての関数を同様に処理する実装を想像することができ、したがって、すべての場合に仮想関数テーブルでポインターを使用します。私は人気者である必要はありません。ただし、より柔軟なオブジェクト システムとシームレスに対話する環境で C++ を実装するのは良い方法かもしれません。 、pythonで)。

于 2012-09-30T12:46:12.830 に答える
1

いいえ。vtable には、同じクラスまたはファイル内の仮想関数へのポインターのみが含まれます。

于 2014-02-27T18:03:26.960 に答える