我正在尝试制作一个模板,该模板应该用作实现的接口(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/