2012-04-26 98 views
2

MSFT編譯器(見http://msdn.microsoft.com/en-us/library/ksek8777.aspx明確壓倒一切

// could be declared __interface I1, making the public scope and pure virtual implied 
// I use the more expressive form here for clarity 
class I1 
{ 
public: 
    virtual void foo() = 0; 
}; 

class I2 
{ 
public: 
    virtual void foo() = 0; 
}; 

class C : public I1, public I2 
{ 
public: 
    virtual void I1::foo() { cout << "I1::foo\n"; } 
    virtual void I2::foo() { cout << "I2::foo\n"; } 
}; 

int main() 
{ 
    C c; 
    static_cast<I1*>(&c)->foo(); 
    static_cast<I2*>(&c)->foo(); 

    cin.get(); 
} 

但是GCC不喜歡這一點。簡單的「顯式覆蓋」在線搜索會產生有關新關鍵字override的信息。這不一定與我正在尋找的東西有關。這個特性在C++ 11(每個規範)中還是以其他方式支持,或者至少以某種方式在gcc中支持?

注意:一個可以接受的答案可能是一個破解 - 只要它與問題的精神相同,而不是解決不同問題的新設計。

回答

3

我認爲唯一的辦法就是通過它實現的功能中級班:

class Impl1 : public I1 { 
public: 
    void foo() { cout << "I1::foo\n"; } 
}; 

class Impl2 : public I2 { 
public: 
    void foo() { cout << "I2::foo\n"; } 
}; 

class C : public Impl1, public Impl2 
{ 
}; 

當然,這使得它相當複雜,一旦這些功能需要訪問的C成員 - 他們不能,成員需要以複雜的方式傳遞。

順便說一下,不需要指針;您可以使用引用:

int main() 
{ 
    C c; 
    static_cast<I1&>(c).foo(); 
    static_cast<I2&>(c).foo(); 
} 

(或用途,其完全避免了從虛擬調度明確的資格:)

c.Impl1::foo(); 
c.Impl2::foo(); 
+0

是可以接受的,偉大的想法。當一個簡單的概念被用來解決問題時,我覺得有些尷尬,我想有時候我們會以一定的思維方式讓自己的頭腦發現,並希望找到一個特定的「類型」答案。對於ref cast vs指針也是+1;我實際上已經有了實際代碼中的指針 - 在複製+粘貼後快速修復示例代碼。儘管如此,很好的指出我們有這個選擇。 (可惜我無法讓你兩次讚不絕口)。 – payo 2012-04-26 19:30:29

+2

@payo,讓我爲你做:) – chris 2012-04-26 19:31:40

+0

@chris +1對你我的朋友:)呵呵 – payo 2012-04-26 19:33:51