我有一个带有两个钻石的类层次结构,因为必须扩展装饰器模式中的所有类(它们已经虚拟扩展):
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没有实现foo()
The type '_sandbox::BDecorator' must implement the inherited pure virtual method '_sandbox::A::foo'
我可以通过在设置上将这种类型的错误设置为“Info”来解决这个问题,但是我想知道GCC忽略的代码中是否存在错误,或者我是否可以做些什么来制作代码分析接受代码?如果有可能,我宁愿不要将此代码分析功能静音,这样我就可以轻松检测到实际错误。
BImpl与BDecorator的不同之处在于它实现了哪些方法?代码分析并没有抱怨BImpl,但他们实现foo()的方式是相似的。
答案 0 :(得分:2)
我认为您可能需要再次索引代码。右键单击项目资源管理器中的项目,单击“索引”,然后单击“刷新所有文件”。这将强制eclipse索引你的所有代码。