[英]invalid covariant return type ( parameters also inherited )
我正在为“虚拟JumpState Jump_peg :: init()”获取此错误无效的协变量返回类型。
class Puzzle{
public:
virtual vector<State> getNext(State) = 0;
virtual State init() = 0;
virtual bool solved(State) = 0;
virtual void print(State) = 0;
};
class Jump_peg:public Puzzle{
private:
int size;
public:
vector<JumpState> getNext(JumpState);
JumpState init();
bool solved(JumpState);
void print(JumpState);
void jump(JumpState,int,int,vector<JumpState>&);
};
在我的代码中,jumpstate继承自state
类JumpState:public State
我想代码中的意图是在派生类型中重写getNext
, init
, solve
和print
,但是由于不同的原因并非如此。
在init
的情况下,由于没有参数,因此编译器会解释您要在基数中使用相同的名称覆盖该函数。 C ++允许用于共变体类型(置换器的返回类型可以是通过在基函数返回的类型的派生类型), 只要返回类型是指针或引用 ,而不是一个值。
在solved
并print
的情况下,派生类型中声明的函数不会覆盖基数中用相同名称声明的函数,因为参数集不相同。 C ++支持协变返回类型,但是参数必须相同,才能覆盖另一个函数。
即使允许对参数进行某些变型,也必须是相反方差 ,而不是协方差,因为协方差会缩小派生类型中函数的契约:基本类型将采用任何 State
,但是派生类型类型只能采用JumpState
。 派生类型将不能替代基类,从而违反了Liskov替代原理。
而且,无论模板参数的关系如何,不同的模板实例化都是无关的类型,因此在getNext
的情况下,即使State
和JumpState
是继承的, vector<State>
和vector<JumpState>
也不会通过继承JumpState
。
当您返回指针或引用而不是类对象时,协变返回类型将起作用。 所以
virtual State& init();
会工作。 不幸的是,更大的问题是
virtual vector<State> getNext(State);
和
vector<JumpState> getNext(JumpState);
是完全无关的功能。 后者不会覆盖前者。 对于接受State
所有其他功能对也是如此。 要覆盖,参数类型必须相同。
您实际上可能需要此:
template <class State> class Puzzle { ..
class Jump_peg : public Puzzle<JumpState> { ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.