ホームページ  >  記事  >  バックエンド開発  >  コンストラクターとデストラクターで「純粋仮想関数呼び出し」クラッシュが発生するのはなぜですか?

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

DDD
DDDオリジナル
2024-11-11 17:28:02527ブラウズ

Why Do

「純粋仮想関数呼び出し」クラッシュの謎を明らかにする

「純粋仮想関数呼び出し」という謎のエラー メッセージが表示されると、ユーザーは抽象クラスのオブジェクトをインスタンス化できないにもかかわらず、プログラムがどのようにしてコンパイルできるのか不思議です。この問題は、コンストラクターまたはデストラクター内で仮想関数を呼び出そうとすることが原因で発生します。

コンパイラーのジレンマ:

オブジェクトの作成中、コンストラクターはオブジェクトの状態を初期化する責任があります。逆に、デストラクターはオブジェクトの破棄を処理します。ただし、派生クラス オブジェクトが不完全か存在しないため、これらの段階では仮想関数呼び出しを行うことはできません。

そのような場合、コンパイラは仮想関数の基本クラス バージョンを呼び出します。ただし、純粋仮想関数には基本クラスに実装がないため、悪名高い「純粋仮想関数呼び出し」エラーが発生します。

説明するコード スニペット:

次の C の例を考えてみましょう:

class Base {
public:
    Base() {
        reallyDoIt(); // INCORRECT, doesn't work
    }
    void reallyDoIt() { doIt(); } // INCORRECT, doesn't work
    virtual void doIt() = 0; // Pure virtual function
};

class Derived : public Base {
    void doIt() {} // Overrides pure virtual function
};

int main() {
    Derived d; // Causes "pure virtual function call" error
}

派生クラスをインスタンス化するとき、プログラムはコンストラクターから realDoIt() を呼び出そうとし、コンストラクターが doIt() を呼び出します。 doIt() は純粋仮想関数であるため、基本クラスには実装がなく、致命的なエラーが発生します。

結論:

「純粋仮想関数」を防ぐには「関数呼び出し」がクラッシュする場合は、コンストラクターまたはデストラクター内で仮想関数呼び出しを行わないようにすることが重要です。これにより、オブジェクトの作成時と破棄時に派生クラスに固有のメソッドのみが呼び出され、基本クラスでの未定義の関数の呼び出しが防止されます。

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

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