2014-03-13 26 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