eclipse cdt的代码分析不了解虚拟继承

Bar*_*aro 7 c++ eclipse code-analysis eclipse-cdt virtual-inheritance

我有一个带有两个钻石的类层次结构,因为必须扩展装饰器模式中的所有类(它们已经虚拟扩展):

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());

}
Run Code Online (Sandbox Code Playgroud)

图形:

       A
      /|\
   v /v| \ v
    /  |  \
AImpl  B  ADecorator
   |  / \  |
   | /   \ |
   |/     \|
BImpl     BDecorator
Run Code Online (Sandbox Code Playgroud)

GCC编译没有问题,但是eclipse的代码分析坚持认为BDecorator没有实现foo()

The type '_sandbox::BDecorator' must implement the inherited pure virtual method '_sandbox::A::foo'
Run Code Online (Sandbox Code Playgroud)

我可以通过在设置上将这种类型的错误设置为"Info"来解决这个问题,但是我想知道GCC忽略的代码中是否存在错误,或者我是否可以做些什么来使代码分析接受码?如果可能的话,我宁愿没有这个代码分析功能被静音,所以我可以很容易地发现实际的错误.

BImpl与BDecorator的不同之处在于它实现了什么方法?代码分析并没有抱怨BImpl,但是他们实现foo()的方式是类似的.

小智 2

我认为您可能需要再次索引您的代码。在项目资源管理器中右键单击您的项目,单击“索引”,然后单击“刷新所有文件”。这将强制 Eclipse 索引所有代码。