我正在尝试制作一个模板,该模板应该用作实现的接口(interface)。这种事情在Java上很容易,但是我正在与C++作战。该代码无法在C2::action()方法中编译。似乎编译器认为我正在尝试分配抽象类型。

我是否缺少复制构造函数...或...什么?

template <class T>
class C1 {
public:
    virtual C1<T> action() = 0;
};

template <class T>
class C2: public C1<T> {
public:
    virtual C1<T> action(){
        C2<T> sub;
        return sub;
    }

};

C2<int> t;
t.action();

最佳答案

C1<T> action()返回C1<T>类型的对象。由于C1<T>是抽象的,所以从action返回永远不可能成功。即使您尝试使用C2<T>之类的具体类型初始化此返回值,它也会遇到object slicing并“变成”一个C1<T>(或尝试这样做)。这会尝试根据C1<T>构造一个C2<T>。但是由于C1<T>是抽象的,因此无法构造。

要启用多态,您需要依赖引用或指针。尽管C1<T>始终是C1<T>,但C1<T>*可以指向C1<T>类型的对象或任何其他公开继承该类型的对象,例如C2<T>。您可以尝试返回std::unique_ptr<C1<T>>而不是C1<T>:

#include <memory>

template <class T>
class C1 {
public:
    virtual std::unique_ptr<C1<T>> action() = 0;
};

template <class T>
class C2: public C1<T> {
public:
    virtual std::unique_ptr<C1<T>> action() override {
        return std::make_unique<C2<T>>();
    }

};

关于c++ - 模板接口(interface)返回类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54371327/

10-15 04:31