私が理解しているように、純粋仮想メソッドが子クラスに実装されない可能性がある条件がありますが、ビルドエラーが発生することなく子クラスを呼び出すことができます。
これをシミュレートすることはできませんでした。誰かがこれを実現する方法について洞察を持っていますか? いろいろ検索しましたが、ヒットしませんでした。
私が理解しているように、純粋仮想メソッドが子クラスに実装されない可能性がある条件がありますが、ビルドエラーが発生することなく子クラスを呼び出すことができます。
これをシミュレートすることはできませんでした。誰かがこれを実現する方法について洞察を持っていますか? いろいろ検索しましたが、ヒットしませんでした。
これは、基本クラスのコンストラクターで仮想関数が呼び出されたときに発生します。
#include <iostream>
class Base
{
public:
Base() { g();}
virtual ~Base() {}
void g() { f(); }
virtual void f() = 0;
};
class Derived : public Base
{
public:
Derived() : Base() {}
~Derived() {}
void f() { std::cout << "Derived f()" << std::endl; }
};
int main()
{
Derived d; // here we have the call to the pure virtual function
return 0;
}
編集:
主な問題は、Derived
オブジェクトが構築されると、オブジェクトが として開始されBase
、次にBase::Base
コンストラクターが実行されることです。オブジェクトはまだ であるためBase
、f()
(経由でg()
) への呼び出しは を呼び出しBase::f
、 を呼び出しませんDerived::f
。コンストラクターが完了するBase::Base
と、オブジェクトは になりDerived
、Derived::Derived
コンストラクターが実行されます。