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

时间:2014-03-13 12:29:49

标签: 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());

}

图形:

       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()的方式是相似的。

1 个答案:

答案 0 :(得分:2)

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