2013-01-05 10 views
3

다음 코드를 고려 기본 클래스를 통해 함수를 정의합니다. 이 상황을 어떻게 해결할 수 있습니까? 이 문제는 다이아몬드 상속과 비슷하지만 해결책을 찾지 못했습니다.파생 클래스는

편집 : 감사합니다,이 작업 예입니다

#include "stdio.h" 

struct A 
{ 
    virtual void f() = 0; 
}; 

struct B 
{ 
    void f() 
    { 
     printf("B::f\n"); 
    } 
}; 

struct C : public A, public B 
{ 
    void f() 
    { 
     printf("C::f\n"); 
     B::f(); 
    } 
}; 

int main() 
{ 
    A* a = new C(); 
    B* b = new C(); 
    C* c = new C(); 

    printf("Calling from A\n"); 
    a->f(); 
    printf("Calling from B\n"); 
    b->f(); 
    printf("Calling from C\n"); 
    c->f(); 
} 

출력 :

Calling from A 
C::f 
B::f 
Calling from B 
B::f 
Calling from C 
C::f 
B::f 
+0

그냥 당신의 의도를 이해하기 : 당신은'A'가 인터페이스를 정의하려면,'B'가 구현와'C'가 함께 퍼팅을 정의? 나는'B : A'에 비해이 이점을 보지 못합니다. 왜냐하면'B'를 구현할 때 구현중인 인터페이스를 이미 알고 있기 때문입니다. 맞습니까? – leemes

+0

'A'에서'B'를 파생시키지 않습니다. 왜냐하면 이것은 훨씬 더 큰 프로젝트에서 만난 문제의 단지 고립 된 예일뿐입니다. –

답변

3

문제는 두 f() 기능들이 같은이 일이 있더라도, 전혀 관련이 있다는 것입니다 이름. 원하는 동작이 Cvirtualf()B::f() 전화를 할 경우

, 당신은 명시 적으로 할 필요가 :

struct C : public A, public B 
{ 
    void f(); 
}; 

void C::f() { 
    B::f(); 
} 
1

당신은 C에서 기본 클래스에서 가상 함수를 재정의해야합니다. 당신이 B::f를 호출 할 경우, 이런 식으로 말 :

struct C : A, B 
{ 
    void f() { B::f(); } 
}; 
관련 문제