Eclipse CDT 的代码分析不理解虚拟继承

eclipse cdt's code analysis doesn't understand virtual inheritance

本文关键字:不理解 虚拟 继承 CDT 代码 Eclipse      更新时间:2023-10-16

我有一个带有两个菱形的类层次结构,这是由于必须在装饰器模式中扩展所有类(它们实际上已经扩展了):

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索引您的所有代码。