1. ホーム
  2. c++

[解決済み] 純粋な仮想関数呼び出し」のクラッシュはどこから来るのか?

2022-03-01 19:19:26

質問

私のコンピュータでは、プログラムが「純粋仮想関数呼び出し」というエラーでクラッシュすることがあります。

抽象クラスでオブジェクトを作成できないのに、どうしてコンパイルできるのでしょうか?

解決方法は?

これらは、コンストラクタやデストラクタから仮想関数を呼び出そうとした場合に発生する可能性があります。 コンストラクタやデストラクタから仮想関数を呼び出すことはできないので(派生クラスのオブジェクトがまだ構築されていないか、すでに破棄されている)、純粋仮想関数の場合は存在しないベースクラスのバージョンを呼び出します。

(ライブデモを見る こちら )

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

void Base::doIt()
{
    std::cout<<"Is it fine to call pure virtual function from constructor?";
}

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

int main(void)
{
    Derived d;  // This will cause "pure virtual function call" error
}