インライン仮想関数は本当に神話ですか?
コードレビューで、「仮想関数はインラインである必要はない」というコメントにより、次のような疑問が生じます。インライン仮想関数の使用。潜在的な利点にもかかわらず、その実用性については疑問が生じます。
関数がオブジェクト上で直接呼び出されるシナリオでは、インライン仮想関数が適しているように思えるかもしれません。しかし、メソッド呼び出しにオブジェクトが使用されているのに、なぜ仮想関数が使用されるのか疑問に思う人もいるかもしれません。
以下のコード スニペットは問題を例示しています。
class Temp { public: virtual ~Temp() {} virtual void myVirtualFunction() const { cout << "Temp::myVirtualFunction" << endl; } }; class TempDerived : public Temp { public: void myVirtualFunction() const { cout << "TempDerived::myVirtualFunction" << endl; } }; int main() { TempDerived aDerivedObj; // Compiler expands virtual functions aDerivedObj.myVirtualFunction(); // Object type for Temp* is known Temp* pTemp = &aDerivedObj; pTemp->myVirtualFunction(); return 0; }
コンパイラは仮想関数をインライン化できますが、オブジェクトの正確なクラスがわかっている場合 (aDerivedObj など) を呼び出しますが、オブジェクトがポインターを介してアクセスされている場合は呼び出しできません。 (pTemp).
この制限により、インライン仮想関数は展開が制限されることが多いため避けるべきでしょうか?
答え:
C の FAQ で説明されているように、仮想関数は特定の状況でインライン化できます:
「インライン仮想呼び出しが可能なのは、このときだけです」インライン化されるのは、コンパイラが仮想関数呼び出しのターゲットであるオブジェクトの「正確なクラス」を認識している場合です。これは、コンパイラがオブジェクトへのポインタまたは参照ではなく、実際のオブジェクトを持っている場合にのみ発生します。"
以上がインライン仮想関数は神話ですか、それとも単に誤解されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。