我有一些第三方抽象基类
struct foo
{
virtual foo*job() = 0;
...
static void* make_space(size_t sizeofDerived);
};
我无法改变。类型的对象foo
(和所有派生类)只能使用placement-new创建/构造到由返回的内存中foo::make_space()
,因为普通构造,如
derived_from_foo z; // or
auto p = new derived_from_foo();
可能会导致不希望的问题(损坏内存,取决于编译器,我最终发现)。所以我的问题是:我如何编写/设计派生类
struct bar // still abstract, since foo::job() is not provided
: foo
{
...
template<typename Derived, typename...Args>
static Derived* create(Args&&...args)
{
return ::new(foo::make_space(sizeof(Derived)))
Derived(std::forward<Args>(args)...);
}
};
这样构造类型的对象或通过除通过以外的任何其他方式bar
派生的任何类型bar
bar::create()
的对象在(i)编译或(ii,不太理想)在运行时失败?