неверный ковариантный тип возвращаемого значения (параметры также наследуются)

0

Я получаю эту ошибку недопустимым ковариантным типом возврата для "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: государственное государство

  • 0
    вперед объявите JumpState прежде чем Jump_peg должен исправить проблему.
  • 0
    @billz: Нет. Это не поможет
Теги:
templates
inheritance

2 ответа

1
Лучший ответ

Возвращаемые типы 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> { ...
2

Я предполагаю, что намерение в коде состоит в том, что getNext, init, solve и print все переопределены в производном типе, но это не так по разным причинам.

В случае init, поскольку аргументов нет, компилятор интерпретирует, что вы хотите переопределить функцию с тем же именем в базе. C++ допускает варианты со-вариантами (возвращаемый тип overrider может быть производным типом типа, возвращаемого функцией в базе) при условии, что тип возврата является либо указателем, либо ссылкой, но не значением.

В случае solved и print функции, объявленные в производном типе, не переопределяют функцию, объявленную с тем же именем в базе, поскольку набор аргументов не является одинаковым. C++ поддерживает ковариантные типы возврата, но аргументы должны быть одинаковыми для функции переопределения другой.

Даже если для аргументов было разрешено какое-либо изменение, оно должно было бы быть противоречивым, а не ковариантным, поскольку коразмерность сузила бы контракт функции в производном типе: базовый тип будет принимать любое State, но производное тип может принимать только JumpState. Полученный тип не будет заменен вместо базы, нарушая Принцип замещения Лискова.

Более того, различные экземпляры шаблонов являются несвязанными типами, независимо от того, какова взаимосвязь аргументов шаблона, поэтому в случае getNext типы vector<State> и vector<JumpState> не связаны наследованием, даже если State и JumpState.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню