2011-02-25 1 views
1

관리되지 않는 C++에서 C# 명시 적 인터페이스 구현과 같은 작업을 수행하려고합니다. 함수 구현이 클래스 정의의 일부인 한 그렇게 할 수 있지만 소스 파일의 함수 구현과 함께 작동시키는 방법을 알 수는 없습니다.Visual Studio 2010에서 C++ 다중 상속 문제가 발생하여 C2509 오류가 발생합니다.

여기 내 테스트 코드입니다 :

class Base 
{ 
public: 

    virtual void Func() = 0; 

    void CallFunc() 
    { 
     Func(); 
    } 
}; 

class Base1 : public Base 
{ 
public: 

    virtual void Func() = 0; 
}; 

class Base2 : public Base 
{ 
public: 

    virtual void Func() = 0; 
}; 

// This Works 

class Multi : public Base1, public Base2 
{ 
public: 

    virtual void Base1::Func() 
    { 
     puts("Base1::Func()"); 
    } 

    virtual void Base2::Func() 
    { 
     puts("Base2::Func()"); 
    } 
}; 


// This does not 

// 1>multipeinheritancetest.cpp(60): error C2509: 'Func' : member function not declared in 'Multi' 
// 1>   multipeinheritancetest.cpp(51) : see declaration of 'Multi' 
// 1>multipeinheritancetest.cpp(65): error C2509: 'Func' : member function not declared in 'Multi' 
// 1>   multipeinheritancetest.cpp(51) : see declaration of 'Multi' 
/* 
class Multi : public Base1, public Base2 
{ 
public: 

    virtual void Base1::Func(); 
    virtual void Base2::Func(); 
}; 

void Multi::Base1::Func() 
{ 
    puts("Base1::Func()"); 
} 

void Multi::Base2::Func() 
{ 
    puts("Base2::Func()"); 
} 
*/ 

// This is a work-around for when I don't want to declare the full function in the header 
/* 
class Multi : public Base1, public Base2 
{ 
public: 

    virtual void Base1::Func() { Base1_Func(); } 
    virtual void Base2::Func() { Base2_Func(); } 

    void Base1_Func(); 
    void Base2_Func(); 
}; 

void Multi::Base1_Func() 
{ 
    puts("Base1_Func()"); 
} 

void Multi::Base2_Func() 
{ 
    puts("Base2_Func()"); 
} 
*/ 

void RunMultiTest() 
{ 
    Multi m; 
    m.Base1::CallFunc(); 
    m.Base2::CallFunc(); 
} 

이 할 수있는 방법이 있나요 내 구문은 꺼져 있거나이 비주얼 스튜디오 버그 또는이 C와 단지 수 없습니다 ++?

+0

문제는 클래스 외부에서'Base1 :: Func'을 정의하는 방법입니다. 작업 예제는 클래스 내부에서 인라인 코드를 사용합니다. –

답변

2

Base1::Func은 "작품"의 경우에도 유효하지 않으며, 귀하의 컴파일러에서 허용됩니다.

두 개의 다른 기능을 원할 경우 두 개의 다른 이름을이라고 부릅니다. 코멘트에서 class Base1 : public virtual Baseclass Base2 : public virtual Base

을 고정하고 함수 재정의 기본 자격을 제거합니다

편집 : 당신은 하나 개의 기능을 원하는 경우, 가상 상속을 사용합니다.

+0

가상 상속이 원하는 솔루션 인 경우 virtual 키워드는 Base1 및 Base2에 속합니다 (예 : "Base1 : public virtual base"및 "class Base2 : public virtual Base" –

+1

) 이름을 변경할 수없는 경우 파티 클래스), 단순한 이름 바꾸기 심 (shim) 인 또 다른 상속 계층을 소개합니다. –

관련 문제