让钻石继承发挥作用,但Eclipse仍然抱怨

Got diamond inheritance working, but Eclipse still complains

本文关键字:Eclipse 继承 钻石 作用      更新时间:2023-10-16

感谢您的光临。

我正在学习c++中的软件模式以熟悉它,并且在基于接口的编程方面遇到了一个问题,即钻石问题。

情况如下:有一个Widget类,从中派生出Button类,每个类都有自己的接口类。Widget类具有foo方法,Button类具有Widgetfoo方法和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不仅继承了CWidgetfoo,而且继承了IButton的(纯虚拟的)。但通过在IButtonCWidget中使用虚拟继承,它编译并运行,将"foobar"打印到屏幕上。

然而,问题是Eclipse将CButton button标记为错误:

The type 'CButton' must implement the inherited pure virtual method 'IWidget::foo'

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

如有任何帮助,我们将不胜感激。

edit:我在OSX Lion上使用的是gcc 4.2,以及用于c++的Eclipse的最新版本。

它对我来说是标准的。我的参考是Stroustrup的"C++编程语言",第3版,15.2.5.1关于钻石继承。他写道:"两个不同的类可能会覆盖虚拟基类中不同的虚拟函数。这样,几个派生类可以为虚拟基类提供接口实现。"他的例子与你的例子结构相同。这是虚拟继承功能的重要组成部分。