返回抽象类子元素的纯虚方法?

时间:2018-03-20 21:12:38

标签: c++ c++17

我试图创建一个抽象类,其子项必须覆盖的方法之一应该返回子类的实例。

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

有没有办法在不使用原始指针作为返回类型的情况下执行我正在寻找的内容?

2 个答案:

答案 0 :(得分:0)

您是否尝试使用CRTP来实现历史上的某些功能?

struct Interface {
    virtual Interface *inflate(std::string const &json) = 0;
    virtual ~Interface() {}
};

template<typename Child> struct Base: public Interface {
    Interface *inflate(std::string const &json) { return new Child(json); }
};

struct Child: public Base<Child> {
    Child(std::string const &json);
};

答案 1 :(得分:0)

您无法创建抽象类型的对象。而且因为你不能创建这样的对象,你也无法返回它。这就是为什么返回基类/派生对象的所有示例总是返回指针或对基类的引用

的原因
struct B {
    virtual B *fromJson(const std::string &jsonStr) const = 0;
};

struct D : public B {
    D(const std::string &jsonStr);
    D *fromJson(const std::string &jsonStr) const;
};

D *D::fromJson(const std::string &jsonStr) const
{
    return new D(jsonStr);
}