ホームページ > バックエンド開発 > C++ > インライン仮想関数は神話ですか、それとも単に誤解されていますか?

インライン仮想関数は神話ですか、それとも単に誤解されていますか?

Patricia Arquette
リリース: 2024-12-27 06:39:14
オリジナル
168 人が閲覧しました

Are Inline Virtual Functions a Myth, or Just Misunderstood?

インライン仮想関数は本当に神話ですか?

コードレビューで、「仮想関数はインラインである必要はない」というコメントにより、次のような疑問が生じます。インライン仮想関数の使用。潜在的な利点にもかかわらず、その実用性については疑問が生じます。

関数がオブジェクト上で直接呼び出されるシナリオでは、インライン仮想関数が適しているように思えるかもしれません。しかし、メソッド呼び出しにオブジェクトが使用されているのに、なぜ仮想関数が使用されるのか疑問に思う人もいるかもしれません。

以下のコード スニペットは問題を例示しています。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート