2014-03-13 27 views
7

我有一个类层次结构所造成的具有所有类延伸的装饰图案两颗钻石(他们已经几乎扩展):Eclipse CDT的代码分析并不了解虚拟继承

namespace _sandbox { 

class A { 
    public: 
     virtual ~A() {} 
     virtual void foo()=0; 
}; 

class ADecorator : public virtual A { 
    private: 
     A* decoratedA; 
    public: 
     ADecorator(A* a) : decoratedA(a) {} 
     void foo() {return decoratedA->foo();} 
}; 

class AImpl : public virtual A { 
    public: 
     void foo() {}; 
}; 

class B : public virtual A { 
    public: 
     virtual ~B() {} 
     virtual void bar()=0; 
}; 

class BDecorator : public ADecorator, public B { 
    private: 
     B* decoratedB; //Copy of the pointer with a different type 
    public: 
     BDecorator(B* b) : ADecorator(b), decoratedB(b) {} 
     void bar() {return decoratedB->bar();} 
}; 

class BImpl : public B, public AImpl { 
    public: 
     void bar() {}; 
}; 

B* b = new BDecorator(new BImpl()); 

} 

图形:

 A 
     /|\ 
    v /v| \ v 
    /| \ 
AImpl B ADecorator 
    |/\ | 
    |/ \ | 
    |/  \| 
BImpl  BDecorator 

GCC编译这个没有问题,但Eclipse的代码分析坚称BDecorator没有实现富()

The type '_sandbox::BDecorator' must implement the inherited pure virtual method '_sandbox::A::foo' 

我可以通过在设置上将这种类型的错误设置为“Info”来消除此问题,但是我想知道GCC忽略的代码中是否存在错误,或者如果有什么我可以做的代码分析接受代码?如果可能的话,我宁愿没有沉默这个代码分析功能,所以我可以很容易地检测到实际的错误。

BImpl与BDecorator在实现什么方法方面有什么不同?代码分析不会抱怨BImpl的任何问题,但他们实现foo()的方式是相似的。

+0

Cool ASSCI艺术,+1。 – Maroun

+1

它是ASCII码,男孩 – hrkz

+1

是的,作为一个新用户+1,用足够的代码非常清晰地提出问题,为冷却的ASCII图形+1。这个问题本身也是一个很好的问题。 –

回答

2

我想你可能不得不重新编制你的代码索引。右键单击项目浏览器中的项目,单击索引,然后单击清新所有文件。这将强制eclipse索引你的所有代码。

+0

这似乎没有改变任何东西。我试图先从“问题”选项卡中删除警告,以确保它们再次生成。 – Baro

+0

这为我解决了同样的问题。 – PaulQ

+0

...并为我修复了两次吧。 :P再次感谢。 – PaulQ