2012-04-26 76 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