コンストラクターとデストラクターで「純粋仮想関数呼び出し」エラーが発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-15 07:12:02
オリジナル
294 人が閲覧しました

Why Do I Get

致命的な「純粋仮想関数呼び出し」エラー: 原因を解明する

「純粋仮想関数」でプログラムがクラッシュするのは困惑することがあるcall」エラー、特に影響を受けるクラスが抽象クラスであるため、オブジェクトの作成を禁止する必要がある場合。この記事は、このようなエラーの背後にある根本的な原因を明らかにし、包括的な説明を提供することを目的としています。

抽象クラスでの仮想関数呼び出し

仮想関数を使用すると、派生クラスをオーバーライドできます。基本クラスの実装によりポリモーフィズムが可能になります。ただし、抽象クラスでは、「純粋仮想関数」として指定された特定の関数は、基本クラスに実装されていません。代わりに、それらはプレースホルダーとして機能し、すべての派生クラスが独自の実装を提供することを要求します。少なくとも 1 つの純粋仮想関数を持たない抽象クラスはインスタンス化できますが、純粋仮想関数を呼び出すとランタイム エラーが発生します。

「純粋仮想関数呼び出し」がクラッシュします

ただし、仮想関数呼び出しがコンストラクターまたはデストラクター内から試行されると、予期しないシナリオが発生する可能性があります。オブジェクトの構築と破棄の制約により、これらの段階では仮想関数呼び出しは許可されません。その結果、仮想関数の基本クラス バージョンが代わりに呼び出されますが、純粋な仮想関数の場合は存在せず、ランタイム クラッシュが引き起こされます。

例の図

次のコード スニペットを考えてみましょう:

class Base
{
public:
    Base() { reallyDoIt(); }
    void reallyDoIt() { doIt(); } // DON'T DO THIS
    virtual void doIt() = 0;
};

class Derived : public Base
{
    void doIt() {}
};

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}
ログイン後にコピー

この例では、仮想関数を呼び出そうとしています。抽象基本クラス (Base) のコンストラクターから (doIt()) を実行すると、派生クラス オブジェクト (d) の作成時に「純粋仮想関数呼び出し」エラーが発生します。 Base には doIt() の実装がないため、呼び出しは純粋仮想関数プレースホルダーに渡されますが、これは無効です。

結論

"純粋仮想関数call」エラーは、仮想関数呼び出しがコンストラクターまたはデストラクターから誤って行われた場合に発生します。このようなクラッシュを回避し、抽象クラスが正しく機能することを保証するには、この制限を理解することが重要です。さらに詳しい洞察については、このテーマに関する Raymond Chen の啓発的な記事を参照してください。

以上がコンストラクターとデストラクターで「純粋仮想関数呼び出し」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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