2011-02-25 67 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(); 
} 

有沒有辦法做到這一點,我的語法只是關閉或這是一個Visual Studio錯誤或者這只是不可能的C++?

+0

問題是如何在類外定義'Base1 :: Func'。該工作示例在類中使用內聯代碼。 – 2011-02-25 17:37:15

回答

2

Base1::Func在您的「作品」情況下無效,它只被您的編譯器接受。

如果你想要兩個不同的功能叫他們兩個不同的名字。如果你想要一個功能,使用虛擬繼承:

編輯:從評論固定 class Base1 : public virtual Baseclass Base2 : public virtual Base

,然後從功能覆蓋基本資格。

+0

如果虛擬繼承是所需的解決方案,則虛擬關鍵字屬於Base1和Base2(即「class Base1:public virtual Base」和「class Base2:public virtual Base」。 – 2011-02-25 20:05:44

+1

如果無法更改名稱(third-黨的類),引入另一層繼承,這只是一個重命名的墊片。 – 2011-02-25 20:14:41

相關問題