2013-09-25 4 views
1

C++의 다이아몬드 문제 (다중 상속)에 대한 해결책을 이해하려고합니다.C++의 다이아몬드 상속 코드가 예상대로 작동하지 않습니다.

솔루션을 더 잘 이해하기 위해이 코드를 작성했지만 예상대로 작동하지 않습니다. 오류 C2385를 :

#include <stdio.h> 

class A 
{ 
public: 
    void Print() 
    { 
     printf("A\n"); 
    } 
}; 

class B : virtual public A 
{ 
public: 
    void Print() 
    { 
     printf("B\n"); 
    } 
}; 

class C : virtual public A 
{ 
public: 
    void Print() 
    { 
     printf("C\n"); 
    } 
}; 

class D : public B, public C 
{ 
}; 

int main() 
{ 
    D d; 
    d.Print(); 
} 

는 비주얼 스튜디오 2008 익스프레스 에디션은 밖으로 고함 '인쇄'의 모호한 접근을 1> 기본 'B' 1의 '인쇄'가 될 수> 또는 '인쇄'에서 수 기본 'C' 오류 C3861 : '인쇄': 식별자를 찾을 수 없습니다.

아무도 알려지지 않은 내용을 알려주십시오.

+0

가능하면 최신 Visual Studio 2013으로 업그레이드하십시오. – TemplateRex

답변

1

Print()의 버전은 d.Print()이어야합니까? 두 가지 선택이 있습니다. 당신은하지만, 선택할 수없는 독특한 최종 최우선 기능이 없기 때문에 A::Print()virtual 기능을하는 것은 도움이되지 않습니다

d.A::Print(); // this one isn't part of the overload set search without qualification 
d.B::Print(); 
d.C::Print(); 

참고. D에서 Print()을 명시 적으로 재정의해야합니다.

+0

다음 예제 (http://www.programmerinterview.com/index.php/c-cplusplus/diamond-problem)는 B의 상속을 제안했습니다. 그리고 C 가상은 문제를 해결할 것입니다 ... – conectionist