2013-07-24 4 views
1

저는 간단한 추상 클래스 (A)와 클래스를 상속 한 클래스 (C)를 가지고 있습니다."추상 클래스를 인스턴스화 할 수 없습니다"오류

class C : A 

문제는 두 번째 코드 (C)에 다른 클래스에서 필요한 코드가 포함되어 있습니다. 그리고 나는이 코드 부분을 클래스 (B)를 분리하기 위해 분리하고, 필요한 클래스에서 그것을 파생시키는 것이 좋다라고 생각한다.

B 그것은 모든 괜찮

(코드의 공유 부분) >> C (타겟) < < A (C위한 추상 염기) - 기본 클래스 (A)에서 선언 추상 기능 제외한 B로 정의되고, 은 C이 아닙니다. 이건 내 실수 야. 그리고 내가

class A // a base class i need to derive from 
{ 
    // ... 
public: virtual bool Get() const; 
    // ... 
}; 

class B // only contains definition for get() 
{ 
public: 
    bool Get() const { return false; } 
}; 

class C : public B, public A // firstly derive from B, than from A.. ?? 
{ 
    // so Get(), required by A is defined in B, which C derives from ... 
    // and i cant derive from A because of that... I can't do that anyway? 
}; 

... 솔루션을 찾고 있어요 난 내가 올바른 설명 희망 ..

+0

그러나 클래스 'A'는 추상적이 아니므로? –

+0

A는 추상적이고 C는 내가 A에서 파생되어야하는 것입니다. 그러나 추상 멤버의 정의는 C가 아니라 B에 있습니다. – Loryan55

+0

이것은 중복 질문이 아닙니다. Lol – Loryan55

답변

2

(B는 A 어떤 관계를 가지고 있지 않기 때문에 B 그것을 구현한다는 사실은 쓸모가), 또는 인터페이스 A에서) (가져 오기를 호출하려는 경우, 당신은 가상 함수 오버로드가 필요합니다

class C : public B, public A 
{ 
public: 
    virtual bool Get() const { 
     return B::Get(); 
    } 
}; 
+0

오, 그래! 이것은 더 낫다! 고맙습니다 – Loryan55

5

당신은 using 문을 사용할 Get 방법을 선택할 수 있습니다

class C : public B, public A 
{ 
public: 
    using B::Get; 
}; 

이 알려줍니다 컴파일러는 B 클래스의 Get 함수를 사용합니다.

A에 순수 가상 메서드가 포함되어 있으면 도움이되지 않습니다.

+2

-1. A에 순수 가상 메소드가 포함되어 있지 않더라도 A의 클래스 C 인터페이스의 인스턴스에서 B를 호출하려고하면 B ::가 아니라 A :: Get을 호출합니다. "사용"이라는 키워드는 구문 해석 설탕이므로 " 인터페이스 A의 가상 함수 테이블을 무시합니다. 예 : C c; & rA = & c; rA.Get(); // B :: Get()이 아닌 A :: Get()을 호출합니다. 그것은 문제시되는 것이 아니라 행동입니다. – user1837009

2

BA에서 상속하고 CB에서 상속해야합니다.

다중 상속은 설명하는 것과 같은 모호성을 초래합니다. A에는 추상 메서드 get()B이 있지만 동일한 방법이 있지만 구현되어 있습니다. AB은 아무런 관계가 없으므로 C에 어떤 메소드가 상속되었는지는 아마도 A의 get()이 아직 구현되지 않았다는 사실에 달려 있습니다. A는 추상 클래스 인 경우

관련 문제