我有一个带有两个菱形的类层次结构,这是由于必须扩展装饰器模式中的所有类(它们实际上已经扩展):
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'
我可以通过在设置中将此类错误设置为“信息”来解决这个问题,但我想知道代码中是否确实存在 GCC 忽略的错误,或者我是否可以做些什么来制作代码分析接受代码?如果可能的话,我宁愿不关闭此代码分析功能,这样我就可以轻松检测到实际错误。
BImpl 与 BDecorator 在实现的方法方面有何不同?代码分析没有对 BImpl 有任何提示,但它们实现 foo() 的方式是相似的。
最佳答案
我认为您可能需要重新索引您的代码。在项目资源管理器中右键单击您的项目,单击索引,然后单击刷新所有文件。这将强制 Eclipse 索引您的所有代码。
关于c++ - eclipse cdt的代码分析不懂虚继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22378690/