1

仮想キーワードを使用しながら、.hファイルとその直後(暗黙のインライン)に関数を記述します。

virtual void g(){cout<<"is Inline?"};

関数は.hに実装されているため、仮想機能は無意味ですか?これはインラインと見なされますか?

4

3 に答える 3

7

関数は.hに実装されているため、仮想機能は無意味ですか?

いいえ。完全virtualinline独立した概念です。

virtualこれは、呼び出されるオブジェクトの動的タイプに応じて、必要に応じて実行時に呼び出す関数が選択されることを意味します。

inlineつまり、関数は複数の変換単位で定義でき、それを使用するすべての変換単位で定義する必要があります。これは(一部のコンパイラでは)関数をインライン化できるようにするために必要ですが、すべての呼び出しを強制的にインライン化するわけではありません。特に、仮想呼び出しは通常インライン化されないため(動的タイプがコンパイル時に決定できる場合を除く)、ここvirtualでは確かにその意味を保持します。

これはインラインと見なされますか?

はい。ただし、(上記のように)すべての呼び出しがインライン化されることを意味するわけではありません。

于 2012-08-23T11:51:29.727 に答える
1

関数は.hに実装されているため、仮想機能は無意味ですか?

いいえ。そう感じる理由はありません。ヘッダーファイルは前処理され、インクルードされている場所にコピーして貼り付けられます。g()したがって、最終的には、.cppファイルに実装するのと同じくらい優れています。

これはインラインと見なされますか?

はい。ただし、ここでは、inline関数呼び出しをそのコンテンツに置き換えるという通常の解釈を意味するものではありません。virtual関数の解決は実行時に行われるため、その(マクロスタイル)方法でインライン化することはできません。
つまり、コンパイラは、すべての変換(.cppファイル)ユニットに対して1つの定義のみを生成することを保証します。したがって、リンカは複数の定義エラーについて文句を言うことはありません。

于 2012-08-23T11:44:50.913 に答える
0

関数を宣言するvirtualと、それは仮想の期間です。ただし、仮想関数は通常実行時に選択されるため、通常、コンパイラーはそれらをインライン化できません。オブジェクトに対して関数を呼び出すと、コンパイル時に呼び出しを解決できるため、コンパイラがその関数をインライン化する場合があります。ただし、コンパイル時に動的型を解決できないため、参照またはポインターを介して呼び出しをインライン化することはできません。

inlineここでの暗黙のインライン化ではなくキーワードもコンパイラーに必須ではないことを考慮に入れてください。それらは単なる提案です。ただし、virtualキーワードは必須です。

于 2012-08-23T11:50:14.750 に答える