感谢您的光临。
我正在浏览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
(纯虚拟)。但是通过在foo
和IButton
中使用虚拟继承,这将编译并运行,将“foobar”打印到屏幕上。
问题是Eclipse正在将IButton
标记为错误:
CWidget
这很奇怪,因为一切都按预期运行。这是Eclipse的语法检查器的问题吗?我知道这个问题还有其他解决办法,所以也许Eclipse试图告诉我我的方法不标准?
非常感谢任何帮助。
编辑:我在OSX Lion上使用gcc 4.2,在c ++上使用最新版本的Eclipse。
答案 0 :(得分:0)
对我来说看起来很标准。我的参考文献是Stroustrup的“The C ++ Programming Language”,第3版,15.2.5.1关于钻石继承。他写道,“两个不同的类可能会覆盖虚拟基础中的不同虚函数。这样,几个派生类可以为虚拟基类提供的接口提供实现。”他的例子与你的结构相同。它是虚拟继承的重要组成部分。