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