C++ 钻石继承工作正常,但Eclipse仍在抱怨

C++ 钻石继承工作正常,但Eclipse仍在抱怨,c++,eclipse,diamond-problem,C++,Eclipse,Diamond Problem,谢谢你的关注 我正在通过C++中的软件模式来熟悉它,并且在基于接口的编程中有一个问题,即菱形问题。 情况是这样的:有一个小部件类,从中派生出一个按钮类,每个类都有自己的接口类。Widget类具有foo方法,按钮类具有Widget的foo方法和bar方法 #include <iostream> using namespace std; class IWidget{ public: virtual void foo() = 0; virtual ~IWidget() {

谢谢你的关注

我正在通过C++中的软件模式来熟悉它,并且在基于接口的编程中有一个问题,即菱形问题。

情况是这样的:有一个
小部件
类,从中派生出一个
按钮
类,每个类都有自己的接口类。
Widget
类具有
foo
方法,
按钮
类具有
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();
}
这很奇怪,因为一切都按预期运行。这是Eclipse的语法检查器的问题吗?我知道这个问题还有其他解决方案,所以也许Eclipse试图告诉我我的方法不是标准的

任何帮助都将不胜感激


<编辑:我使用的是GCC 4.2在OSX狮子上,以及Eclipse C++的最新版本。

< P> >它看起来是标准的。我的参考文献是Stroustrup的“C++编程语言”,第三版,152.5.1关于钻石继承。他写道,“两个不同的类可能会覆盖虚拟基类中不同的虚拟函数。这样,几个派生类可以为虚拟基类提供的接口提供实现。”他的示例与您的示例具有相同的结构。它是虚拟继承的一个重要部分。

你真的需要能够将
CButton
视为
IWidget
IButton
?我可以定义
IButton
包含
foo
bar
方法。我对C++是新的,所以也许这是首选的方法(它有明确的好处,因为看<代码> IButton <代码>告诉你所有的<代码> CButton <代码>的功能),但是如果在iWIDGET中有<代码> Foo1,<代码> FoO2,…,<代码> Foo30方法?我必须把它们全部拷贝到IButton,改变IWIDGET中的任何东西意味着手动改变iButton。你使用什么编译器(注意“Eclipse”不是C++编译器)。GCC4.7很好地构建了您的示例。为了好玩,这里有一个不同的钻石继承解决方案。他使用模板,因此(使用我的示例)
CButton
继承了
CWidget
,它继承了
IButton
,它继承了
IWidget
。问题是实例化一个widget需要
widget-mywidget(即,您必须显式地将接口类放在尖括号中)。问题是,gcc不能用于提供CDT所需的信息,以便执行智能自动完成之类的操作。Gcc将不会提供有关该计划的足够信息。信不信由你,这是出于意识形态的原因。我不确定这是否有帮助,但你可以尝试使用CWidget::foo添加一个
CButton
。这用于解决多重继承中的歧义。见第15.2.2节。
The type 'CButton' must implement the inherited pure virtual method 'IWidget::foo'