3

感谢您的关注。

我正在通过 C++ 中的软件模式来熟悉它,并且在基于接口的编程方面遇到了问题 - 即菱形问题。

情况如下:有一个Widget类派生一个Button类,每个类都有自己的接口类。类Widgetfoo方法,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++。

4

1 回答 1

0

对我来说它看起来很标准。我的参考资料是 Stroustrup 的“The C++ Programming Language”,第 3 版,15.2.5.1,关于菱形继承。他写道,“两个不同的类可能会覆盖来自虚拟基类的不同虚拟函数。这样,​​几个派生类可以为虚拟基类提供的接口贡献实现。” 他的示例与您的示例具有相同的结构。这是虚拟继承的重要组成部分。

于 2012-07-23T11:34:48.767 回答