2013-11-21 5 views
0

는 나는이 당신이 뭐가 잘못 무언가를 제안 할 수 행한 '() 가상 JumpState Jump_peg :: 초기화' 이 오류 무효 공변 반환 형식을 얻고있다 (매개 변수는 상속)? 나는 코드의 의도는 getNext, init, solveprint 모두에서 재정의되는 것을 상상 공공 주무효 공변 반환 형식

+0

앞으로'JumpState'을 선언합니다. – billz

+0

@billz : 아니요. 그건 도움이되지 않습니다. –

답변

1

포인터 또는 참조를 반환 할 때 공변 반환 형식이 작동하지만 클래스 개체는 반환하지 않습니다. 따라서

virtual State& init(); 

이 적용됩니다. 불행하게도, 더 큰 문제는

virtual vector<State> getNext(State); 

vector<JumpState> getNext(JumpState); 

완전히 관련이없는 기능이 있다는 것입니다. 후자는 전자를 무시하지 않습니다. State을 허용하는 다른 모든 함수 쌍에서도 마찬가지입니다. 재정의하려면 매개 변수 유형이 동일해야합니다.

실제로이 필요하게 될 수 있습니다`Jump_peg`이 문제를 해결해야하기 전에

template <class State> class Puzzle { .. 

class Jump_peg : public Puzzle<JumpState> { ... 
2

:

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을 상속 파생 된 유형이지만, 다른 이유로 이러한 경우는 아닙니다.

init의 경우 인수가 없으므로 컴파일러는 함수의 기본 설정을 동일한 이름으로 재정의하려는 것으로 해석합니다. C++은 가 리턴 타입 중 하나 포인터 또는 참조 것을 제공 (기지의 함수에 의해 리턴 된 형태의 파생 형태 일 수 overrider의 복귀 형) 공동 변형 유형을 허용하지만 아니 값입니다. 파생 된 타입에서 선언 solvedprint 및 기능의 경우

하지 인수의 세트로베이스에 같은 이름으로 선언 된 기능을 대체하는 것은 동일하지 을한다. C++은 공변 (covariant) 리턴 타입을 지원하지만, 함수가 다른 것을 오버라이드 (override)하기 위해서는 인수가 동일해야합니다.

비록 변이가 허용된다하더라도, 공 편차는 파생 된 유형의 함수 계약을 축소 할 것이므로 반 편차이어야합니다. 모두State이지만 파생 유형은 JumpState 만 사용할 수 있습니다. 파생 된 유형은 기초 대신에 대체 가능하지 않으며 Liskov 대체 원칙을 위반합니다. 유형 vector<State>vector<JumpState>이 경우에도 StateJumpState은 상속으로 관련이없는 getNext의 경우 있도록

는 또한, 다른 템플릿 인스턴스화는 상관없이 템플릿 인수의 관계가 무엇인지 관련이없는 유형이다.

관련 문제