Я получаю эту ошибку недопустимым ковариантным типом возврата для "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 наследуется от состояния
класс JumpState: государственное государство
Возвращаемые типы Covariant работают, когда вы возвращаете указатели или ссылки, но не объекты класса. Так
virtual State& init();
должно сработать. К сожалению, большая проблема заключается в том, что
virtual vector<State> getNext(State);
а также
vector<JumpState> getNext(JumpState);
являются абсолютно несвязанными функциями. Последнее не отменяет первого. То же самое верно для всех других пар функций, которые принимают State
. Для переопределения типы параметров должны быть одинаковыми.
Вам действительно может понадобиться следующее:
template <class State> class Puzzle { ..
class Jump_peg : public Puzzle<JumpState> { ...
Я предполагаю, что намерение в коде состоит в том, что getNext
, init
, solve
и print
все переопределены в производном типе, но это не так по разным причинам.
В случае init
, поскольку аргументов нет, компилятор интерпретирует, что вы хотите переопределить функцию с тем же именем в базе. C++ допускает варианты со-вариантами (возвращаемый тип overrider может быть производным типом типа, возвращаемого функцией в базе) при условии, что тип возврата является либо указателем, либо ссылкой, но не значением.
В случае solved
и print
функции, объявленные в производном типе, не переопределяют функцию, объявленную с тем же именем в базе, поскольку набор аргументов не является одинаковым. C++ поддерживает ковариантные типы возврата, но аргументы должны быть одинаковыми для функции переопределения другой.
Даже если для аргументов было разрешено какое-либо изменение, оно должно было бы быть противоречивым, а не ковариантным, поскольку коразмерность сузила бы контракт функции в производном типе: базовый тип будет принимать любое State
, но производное тип может принимать только JumpState
. Полученный тип не будет заменен вместо базы, нарушая Принцип замещения Лискова.
Более того, различные экземпляры шаблонов являются несвязанными типами, независимо от того, какова взаимосвязь аргументов шаблона, поэтому в случае getNext
типы vector<State>
и vector<JumpState>
не связаны наследованием, даже если State
и JumpState
.
JumpState
прежде чемJump_peg
должен исправить проблему.