一度は基本クラスコンストラクターで派生クラスの上書きされた関数を呼び出すことができないので、この動作をエミュレートしたいと思います(C#、Java、...が内部で行っていることと同様です)。
私が(署名の観点から)思いつくことができる最もエレガントなものは次のとおりです。
class Base {
protected:
virtual void init() {
}
template <typename T, typename ...U>
T internal_create(U&& u) {
T instance(std::forward<U>(u)...);
instance.init();
return instance;
}
};
class Derived : public Base {
protected:
Derived() = default;
virtual void init() override {
}
public:
static Derived create() {
return internal_create<Derived>();
}
};
Whereは、(パブリックの観点create
から)コンストラクターの代わりとして機能し、オブジェクトをインスタンス化する唯一の方法です。問題は、すべての派生クラスがを実装する必要があるため、これをより簡単に実現できるかどうかです。create