仮想キーワードを使用しながら、.hファイルとその直後(暗黙のインライン)に関数を記述します。
virtual void g(){cout<<"is Inline?"};
関数は.hに実装されているため、仮想機能は無意味ですか?これはインラインと見なされますか?
関数は.hに実装されているため、仮想機能は無意味ですか?
いいえ。完全virtual
にinline
独立した概念です。
virtual
これは、呼び出されるオブジェクトの動的タイプに応じて、必要に応じて実行時に呼び出す関数が選択されることを意味します。
inline
つまり、関数は複数の変換単位で定義でき、それを使用するすべての変換単位で定義する必要があります。これは(一部のコンパイラでは)関数をインライン化できるようにするために必要ですが、すべての呼び出しを強制的にインライン化するわけではありません。特に、仮想呼び出しは通常インライン化されないため(動的タイプがコンパイル時に決定できる場合を除く)、ここvirtual
では確かにその意味を保持します。
これはインラインと見なされますか?
はい。ただし、(上記のように)すべての呼び出しがインライン化されることを意味するわけではありません。
関数は.hに実装されているため、仮想機能は無意味ですか?
いいえ。そう感じる理由はありません。ヘッダーファイルは前処理され、インクルードされている場所にコピーして貼り付けられます。g()
したがって、最終的には、.cppファイルに実装するのと同じくらい優れています。
これはインラインと見なされますか?
はい。ただし、ここでは、inline
関数呼び出しをそのコンテンツに置き換えるという通常の解釈を意味するものではありません。virtual
関数の解決は実行時に行われるため、その(マクロスタイル)方法でインライン化することはできません。
つまり、コンパイラは、すべての変換(.cppファイル)ユニットに対して1つの定義のみを生成することを保証します。したがって、リンカは複数の定義エラーについて文句を言うことはありません。
関数を宣言するvirtual
と、それは仮想の期間です。ただし、仮想関数は通常実行時に選択されるため、通常、コンパイラーはそれらをインライン化できません。オブジェクトに対して関数を呼び出すと、コンパイル時に呼び出しを解決できるため、コンパイラがその関数をインライン化する場合があります。ただし、コンパイル時に動的型を解決できないため、参照またはポインターを介して呼び出しをインライン化することはできません。
inline
ここでの暗黙のインライン化ではなくキーワードもコンパイラーに必須ではないことを考慮に入れてください。それらは単なる提案です。ただし、virtual
キーワードは必須です。