让钻石继承发挥作用,但Eclipse仍然抱怨
Got diamond inheritance working, but Eclipse still complains
感谢您的光临。
我正在学习c++中的软件模式以熟悉它,并且在基于接口的编程方面遇到了一个问题,即钻石问题。
情况如下:有一个Widget
类,从中派生出Button
类,每个类都有自己的接口类。Widget
类具有foo
方法,Button
类具有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();
}
所以问题是CButton不仅继承了CWidget
的foo
,而且继承了IButton
的(纯虚拟的)。但通过在IButton
和CWidget
中使用虚拟继承,它编译并运行,将"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关于钻石继承。他写道:"两个不同的类可能会覆盖虚拟基类中不同的虚拟函数。这样,几个派生类可以为虚拟基类提供接口实现。"他的例子与你的例子结构相同。这是虚拟继承功能的重要组成部分。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- Eclipse报告了有效cpp继承的错误
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- 让钻石继承发挥作用,但Eclipse仍然抱怨
- 使用从命名空间继承的类的Eclipse相对缩进
- Eclipse CDT 的代码分析不理解虚拟继承