感谢您的关注。
我正在通过 C++ 中的软件模式来熟悉它,并且在基于接口的编程方面遇到了问题 - 即菱形问题。
情况如下:有一个Widget
类派生一个Button
类,每个类都有自己的接口类。类Widget
有foo
方法,Button
类有Widget
'foo
方法和bar
方法。
#include <iostream>
using namespace std;
class IWidget{
public:
virtual void foo() = 0;
virtual ~IWidget() {}
};
class IButton : virtual public IWidget{
public:
virtual void bar() = 0;
virtual ~IButton() {}
};
class CWidget : virtual public IWidget{
public:
void foo(){ cout << "foo"; }
};
class CButton : public CWidget, public IButton{
public:
void bar() { cout << "bar"; }
};
int main(){
CButton button;
button.foo();
button.bar();
}
所以问题是 CButton 不仅继承了CWidget
's foo
,还继承了IButton
's (这是纯虚拟的)。IButton
但是通过在and中使用虚拟继承CWidget
,它可以编译并运行,将 'foobar' 打印到屏幕上。
但问题是 Eclipse 被标记CButton button
为错误:
The type 'CButton' must implement the inherited pure virtual method 'IWidget::foo'
这很奇怪,因为一切都按预期运行。这是 Eclipse 的语法检查器的问题吗?我知道这个问题还有其他解决方案,所以也许 Eclipse 试图告诉我我的方法不标准?
任何帮助将不胜感激。
编辑:我在 OSX Lion 上使用 gcc 4.2,以及最新版本的 Eclipse for c++。