一度は基本クラスコンストラクターで派生クラスの上書きされた関数を呼び出すことができないので、この動作をエミュレートしたいと思います(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