【发布时间】:2018-03-20 21:12:38
【问题描述】:
我正在尝试创建一个抽象类,其子类必须重写的方法之一应该返回子类的实例。
class JsonSerializable {
public:
virtual <child_of_JsonSerializable> fromJson(string jsonStr) const = 0;
};
class ConcreteSerializable : public JsonSerializable {
public:
ConcreteSerializable fromJson(string jsonStr) const {
return ConcreteSerializable();
}
};
我尝试使用 answer 之后的模板,但收到 templates may not be virtual 的错误。
有没有办法在不使用原始指针作为返回类型的情况下做我正在寻找的事情?
【问题讨论】:
-
你看过CRTP吗?
-
看起来你正在寻找的是一个伪装成成员函数的工厂方法。返回基类有什么问题?所有虚函数仍将按预期运行,唯一的问题是
sizeof,这意味着您需要小心将它们存储在数组中或通过memcpy进行复制——这两者在还是第一名 -
@YePhIcK CRTP 似乎是我的问题的解决方案,但我想明白你的意思。如何返回基类?基类是抽象的,如果我把它作为返回类型,我会得到一个编译错误。
-
struct Derived: Base { Base& get() {return *this;} };是一种方法