ホームページ >バックエンド開発 >C++ >「純粋仮想関数呼び出し」エラーがプログラムのクラッシュを引き起こすのはなぜですか?

「純粋仮想関数呼び出し」エラーがプログラムのクラッシュを引き起こすのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-12 12:25:01491ブラウズ

Why Do

「純粋仮想関数呼び出し」のクラッシュについて

プログラミングでは、「純粋仮想関数呼び出し」エラーによりプログラムが突然クラッシュすることがあります。これらのエラーは、オブジェクトの構築または破棄中に純粋仮想関数を呼び出そうとしたときに発生します。

純粋仮想関数

純粋仮想関数は、次のメンバー関数です。宣言だけを持ち、実装を持たない抽象クラス。これにより、派生クラスに関数の独自バージョンの実装が強制されます。

コンストラクターとデストラクターの制限

コンストラクター関数とデストラクター関数は、それぞれオブジェクトの初期化と破棄中に呼び出されます。これらの特別な関数の間、仮想関数の呼び出しは禁止されています。次の理由からです。

  • コンストラクターは、まだ構築されていない可能性のある派生クラス メンバーにアクセスできません。
  • デストラクターは、既に構築されている可能性のある派生クラス メンバーにアクセスできません。破壊されました。

のソースクラッシュ

「純粋仮想関数呼び出し」クラッシュは、次の場合に発生します。

  • コンストラクターまたはデストラクターから純粋仮想関数を明示的に呼び出します。
  • 間接的に呼び出します。コンストラクターから呼び出される関数を通じて純粋仮想関数を呼び出すか、 destructor.

次のコードを考えてみましょう:

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 内の realDoIt() の呼び出しです。コンストラクターは純粋仮想関数 doIt() を呼び出そうとします。コンストラクターが呼び出されているため、派生クラス オブジェクトはまだ構築されておらず、「純粋仮想関数呼び出し」エラーが発生します。

解決策

これらを回避するにはクラッシュする場合は、コンストラクターまたはデストラクターから純粋な仮想関数を呼び出さないようにしてください。代わりに、純粋な仮想関数を呼び出す前に、派生クラスが独自の実装を提供していることを確認してください。

以上が「純粋仮想関数呼び出し」エラーがプログラムのクラッシュを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。