钻石继承工作,但Eclipse仍然抱怨

时间:2012-07-12 18:58:45

标签: c++ eclipse diamond-problem

感谢您的光临。

我正在浏览c ++中的软件模式以熟悉它,并且遇到基于接口的编程问题 - 即钻石问题。

以下是这种情况:有一个Widget类派生出一个Button类,每个类都有自己的接口类。 Widget类具有foo方法,Button类具有Widget的{​​{1}}方法和foo方法。

bar

问题在于,CButton不仅继承了#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(); } 的{​​{1}},还继承了CWidget(纯虚拟)。但是通过在fooIButton中使用虚拟继承,这将编译并运行,将“foobar”打印到屏幕上。

问题是Eclipse正在将IButton标记为错误:

CWidget

这很奇怪,因为一切都按预期运行。这是Eclipse的语法检查器的问题吗?我知道这个问题还有其他解决办法,所以也许E​​clipse试图告诉我我的方法不标准?

非常感谢任何帮助。

编辑:我在OSX Lion上使用gcc 4.2,在c ++上使用最新版本的Eclipse。

1 个答案:

答案 0 :(得分:0)

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