C++ 钻石继承工作正常,但Eclipse仍在抱怨
谢谢你的关注 我正在通过C++中的软件模式来熟悉它,并且在基于接口的编程中有一个问题,即菱形问题。 情况是这样的:有一个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() {
小部件
类,从中派生出一个按钮
类,每个类都有自己的接口类。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'