我有一个类层次结构所造成的具有所有类延伸的装饰图案两颗钻石(他们已经几乎扩展):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。这个问题本身也是一个很好的问题。 –