我有一個類層次結構所造成的具有所有類延伸的裝飾圖案兩顆鑽石(他們已經幾乎擴展):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()的方式是相似的。
Cool ASSCI藝術,+1。 – Maroun
它是ASCII碼,男孩 – hrkz
是的,作爲一個新用戶+1,用足夠的代碼非常清晰地提出問題,爲冷卻的ASCII圖形+1。這個問題本身也是一個很好的問題。 –