繁体   English   中英

无效的协变量返回类型(参数也继承了)

[英]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

我想代码中的意图是在派生类型中重写getNextinitsolveprint ,但是由于不同的原因并非如此。

init的情况下,由于没有参数,因此编译器会解释您要在基数中使用相同的名称覆盖该函数。 C ++允许用于共变体类型(置换器的返回类型可以是通过在基函数返回的类型的派生类型), 只要返回类型是指针引用 ,而不是一个值。

solvedprint的情况下,派生类型中声明的函数不会覆盖基数中用相同名称声明的函数,因为参数集不相同。 C ++支持协变返回类型,但是参数必须相同,才能覆盖另一个函数。

即使允许对参数进行某些变型,也必须是相反方差 ,而不是协方差,因为协方差会缩小派生类型中函数的契约:基本类型将采用任何 State ,但是派生类型类型只能采用JumpState 派生类型将不能替代基类,从而违反了Liskov替代原理。

而且,无论模板参数的关系如何,不同的模板实例化都是无关的类型,因此在getNext的情况下,即使StateJumpState是继承的, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM