5

言い換えれば、関数の定義が派生クラスで変更され、その派生クラスの動的に割り当てられたメモリへのポインターが変更された関数を呼び出す場合、特にその関数は基本クラスではなく呼び出されますか?

virtual キーワードを使用しないことが、プログラマーの利益になるのはどのような場合ですか?

4

4 に答える 4

6

virtualキーワードは、動的ディスパッチを実装するようにコンパイラに指示します。これが言語の設計方法です。このようなキーワードがないと、コンパイラは動的ディスパッチを実装するかどうかを判断できません。

virtualまたは動的ディスパッチの一般的な欠点は、

  • わずかなパフォーマンスの低下があります。ほとんどのコンパイラは、vtable および vptr メカニズムを使用して動的ディスパッチを実装します。この場合、呼び出す適切な関数は vtable によって決定されるため、動的ディスパッチの場合は追加の間接化が必要になります。
  • クラスを非PODにします。
于 2012-11-28T08:43:40.653 に答える
2

一つの理由:

ライブラリのように、別のモジュールにある基本クラスを検討してください。

アプリケーションの派生クラス。

ライブラリのコンパイル中にコンパイラは、指定された関数が仮想である/仮想でなければならないことをどのように認識しますか。

于 2012-11-28T08:43:20.250 に答える
2

C++ の主要な設計原則の 1 つは、C++ では使用されていない機能のオーバーヘッドが発生しないことです (「ゼロ オーバーヘッドの原則」)。これは、高性能に焦点を当てているためです。

これが、Java などの言語では関数がデフォルトで仮想であるのに対し、仮想関数などの機能をオプトインする必要がある理由です。

于 2012-11-28T09:11:50.037 に答える
0

できないので、コンパイラは知りません。すべての機能には常にコストがかかるため、仮想機能を使用しないことを意図している可能性があります。

于 2012-11-28T08:41:11.120 に答える