C++ のすべての仮想関数は V テーブルに格納されます。仮想関数の場合、オーバーライドが行われます。 仮想関数をテーブルから直接呼び出して、V テーブルに含まれる関数を特定できる方法があるかどうかを尋ねたいと思います。
2851 次
4 に答える
2
を使用して仮想関数が実装されるという標準による保証はありませんv-table
。したがって、そのコンパイラが確実に使用する場合にのみ、v-table
必要なオフセットを見つけることができます。
于 2013-06-14T10:33:51.000 に答える
2
ポータブル、いいえ。この言語では、仮想ディスパッチの実装方法は指定されておらず、動作方法のみが指定されています。必ずしも v-table を使用して実装されるとは限らず、呼び出す以外に仮想関数にアクセスする方法はありません。
特定の ABI を 1 つだけサポートする必要がある場合は、仮想ディスパッチ メカニズムと同じ方法でオブジェクトを関数ポインターにマップするために、いくつかの危険なポインター キャストと共に実装の詳細を使用できます。ただし、定義された言語の外に出て、サポートされていない移植性のない領域に足を踏み入れることになるため、何をしようとしているのかを再考することを強くお勧めします.
于 2013-06-14T10:33:58.717 に答える