「純粋仮想関数呼び出し」クラッシュの謎を明らかにする
「純粋仮想関数呼び出し」という謎のエラー メッセージが表示されると、ユーザーは抽象クラスのオブジェクトをインスタンス化できないにもかかわらず、プログラムがどのようにしてコンパイルできるのか不思議です。この問題は、コンストラクターまたはデストラクター内で仮想関数を呼び出そうとすることが原因で発生します。
コンパイラーのジレンマ:
オブジェクトの作成中、コンストラクターはオブジェクトの状態を初期化する責任があります。逆に、デストラクターはオブジェクトの破棄を処理します。ただし、派生クラス オブジェクトが不完全か存在しないため、これらの段階では仮想関数呼び出しを行うことはできません。
そのような場合、コンパイラは仮想関数の基本クラス バージョンを呼び出します。ただし、純粋仮想関数には基本クラスに実装がないため、悪名高い「純粋仮想関数呼び出し」エラーが発生します。
説明するコード スニペット:
次の 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 サイトの他の関連記事を参照してください。