模板接口返回类型

时间:2019-01-25 18:57:10

标签: c++

我正在尝试制作一个模板,该模板应该用作实现的接口。这种事情在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();

1 个答案:

答案 0 :(得分:2)

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>>();
    }

};