2013-09-07 4 views
12

고유 한 형식의 인수를 사용하는 메서드로 인터페이스 (가상 기본 클래스가 C++로 작성)를 만들 계획입니다.파생 클래스 유형의 재정의 함수 매개 변수 유형

class Base { 
public: 
    virtual void seriousMethod(const Base &arg) = 0; 
} 

그러나 파생 클래스는 기본 클래스 형식의 인수가 아니라 파생 클래스 형식의 인수를 가져야합니다.

class Derived: public Base { 
public: 
    virtual void seriousMethod(const Derived &arg) { /* ... */ } 
} 

어떻게 알 수 있습니까? 기본 클래스 (예 : Base<Derived>)를 템플릿해야하나요 아니면 더 깨끗한 솔루션이 있습니까?

+0

요점 -이 작업을 수행하는 동기는 무엇입니까? –

+0

"그러나 파생 클래스는 기본 클래스 형식의 인수가 아니라 파생 클래스 형식의 인수를 가져야합니다."- 가상 메서드를 사용하는 데있어 중요한 점은 무엇입니까? – berak

+0

@EdHeal 구체적으로, 파생 된 구현에 의해 지정되는 A-Star 검색 일반 노드 클래스. – Appleshell

답변

13

직접 할 수 없습니다.

컴파일시
Base b; 
Derived d; 
Base& d_ref = d; 
d_ref.seriousMethod(b); // What happens here? 

변수 d_ref이 정적 유형 Base이 있으므로 Base의 정의에 따르면, seriousMethod에 매개 변수로 b을 할 수 있어야한다 :이 경우에 대해 생각합니다. 이 Derived의 정의에 의하면, seriousMethod 파라미터로서 b 걸릴 수 있도록

그러나 런타임

d_ref의 동적 유형은 Derived이다. Base 개체 ( Base이 추상적이지 않은 경우)이거나 Base에서 파생 된 다른 클래스 인 Derived 일 수 있으므로 bDervied으로 변환 할 수 없습니다.

당신은 이것에 대해 갈 수있는 유일한 방법은 호기심-반복 템플릿 패턴, 즉 템플릿 Base이라고 가정하고 Dervied을 정의 올바른지은 :

class Derived : public Base<Derived> { ... } 

이 문제가 각각 있기 때문에, 위의 그림과 제거 Base<T>에서 파생 된 유형은 고유 한 기본 클래스를 가지며 상속을 통해 서로 관련되지 않습니다.

관련 문제