gpt4 book ai didi

c++ - 无效的协变返回类型(参数也被继承)

转载 作者:行者123 更新时间:2023-11-28 00:38:12 25 4
gpt4 key购买 nike

我收到这个错误“virtual 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)状态

最佳答案

我想代码中的意图是 getNext , init , solveprint在派生类型中都被重写了,但由于不同的原因,情况并非如此。

init的情况下,因为没有参数,编译器解释你想用基类中的相同名称覆盖函数。 C++ 允许共变类型(重写器的返回类型可以是基函数返回类型的派生类型)提供返回类型是指针引用,但不是值。

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

即使参数允许一些变化,它也必须是反方差,而不是协方差,因为协方差会缩小派生类型中函数的契约:基类型将采用任何 State , 但派生类型只能取 JumpState .派生类型不能替代基类,这违反了里氏替换原则。

此外,不同的模板实例化是不相关的类型,无论模板参数的关系是什么,所以在getNext的情况下类型 vector<State>vector<JumpState>与继承无关,即使 StateJumpState是。

关于c++ - 无效的协变返回类型(参数也被继承),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20112229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com