1

また、非仮想関数にも同じ方法を使用しないのはなぜですか?

つまり、なぜそのように仮想関数を使用するのでしょうか。それらを非仮想的なものとして使用し、それらをオーバーライドすることはできませんか?

そして、この方法で時間やスペースなどを節約できるのであれば、非仮想関数に同じ方法を使用してみませんか?つまり、特定のクラスに対して1つの関数テーブルがあることは理にかなっています。

とにかく、事前のおかげで、私は少し混乱しています。

4

3 に答える 3

6

レベルの間接参照を使用せずに実行時のポリモーフィズムを持つことはできません。それがvptrの目的です。

vptrは、非ポリモーフィック関数には使用されません。これは、その間接参照にコストがかかるためです。C ++の哲学は、使用しないものにお金を払わないというものです。

編集:

仮想テーブルがどのように機能するかについての情報は次のとおりです:http://en.wikipedia.org/wiki/Virtual_table

于 2010-12-20T17:31:23.420 に答える
2

コンパイラは基本的に、非仮想メソッドへの直接呼び出しを生成します。仮想メソッド呼び出しを使用すると、コンパイラーはメソッドのアドレスを検索するコードを生成してから、そのアドレスを呼び出します。したがって、理論的には、仮想関数を呼び出すときに少なくとももう1つルックアップします。そうでなければ、その費用を負担する理由はありません。

于 2010-12-20T17:34:00.333 に答える
2

vptrを使用すると、変数タイプではなくオブジェクトタイプに基づいてメソッドを解決できます。vptrを使用しないと、メソッド呼び出しが高速になります。C ++設計者は、仮想関数の利便性を許可することを決定しましたが、他の関数のパフォーマンスの低下は要求しません。

于 2010-12-20T17:34:07.190 に答える