2

나는 다음과 같습니다 순수 가상 메서드 AbstractMethod를 오버라이드 (override)되지 않기 때문에개인 상속 된 메서드를 사용하여 순수 가상 메서드를 재정의하려면 어떻게해야합니까?

class Abstract 
{ 
    virtual void AbstractMethod() = 0; 
}; 

class Implementer 
{ 
    void AbstractMethod() {}; 
}; 

class Concrete : public Abstract, private Implementer 
{}; 

내가 Concrete을 인스턴스화 할 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

왜 당신은 Abstract에서 Implementer를 상속받지 못했습니까? – Cogwheel

+0

@Cogwheel - 내가 사용하려고하는 개념을 더 분명하게 표현한다는 것은 나에게 보인다. –

+1

@Cogwheel oh hai! – M2tM

답변

6

여기에서 다중 상속을 사용하고 있습니다.

콘크리트에는 두 가지 계층 구조가 별도로 처리됩니다.

초록 및 구현 자. Abstract는 Implementer와 아무런 관련이 없으므로 (형제 상속의 경우) 가상의 사용은 실패합니다.

파생 클래스에서 가상 함수를 재정의해야합니다. 당신이 시도하는 방식으로 그것을 할 수 없습니다. 이 같은를 다시 작성한다면

구체적으로는 작동합니다 :

class Abstract 
{ 
    virtual void AbstractMethod() = 0; 
}; 

class Implementer : private Abstract 
{ 
    void AbstractMethod() {}; 
}; 

class Concrete : public Implementer 
{}; 

나는이 문제에 영향을주지 않습니다 콘크리트의 공공 또는 민간 상속의 사용을 지적하고 싶습니다. 원래의 예제에서 Implementer를 public으로 변경하면 여전히 구체적인 클래스가되지 않습니다.

유용한 보조 정보 : 가능한 경우 다중 상속을 피하고 상속보다 합성을 선호하며 깊은 상속을 선호합니다. http://en.wikipedia.org/wiki/Composition_over_inheritance

다중 상속 경로를 수행하는 경우 C++에서 기본적으로 사용되는 별도의 상속 계층 구조와 다른 경로를 결합하는 가상 상속이 필요합니다 (가상 메서드는 여전히 상속 클래스를 필요로하며이를 상속하지 않습니다. 형제 교실) : http://en.wikipedia.org/wiki/Multiple_inheritance

+1

또는 그냥 콘크리트에 순수 가상을 구현합니다 ... – Deduplicator

+0

그래서 두 계층은 어떻게 든 "통합"될 수 없습니다. 콘크리트 ', 어떤 식 으로든? –

+0

@Deduplicator - 나는 또한 오류를 제거 할 수있는 프로그램을 작성할 수 없습니다.) –

관련 문제