由于曾经无法在基类构造函数中调用派生类的覆盖函数,因此我想模拟这种行为(类似于 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>();
}
};
Wherecreate
可以替代构造函数(从公共的角度来看),并且是实例化对象的唯一方法。问题是这是否可以更简单地实现,因为现在每个派生类都必须实现create
.