Eclipse CDT 的代码分析不理解虚拟继承
eclipse cdt's code analysis doesn't understand 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'
我可以通过在设置上将这种类型的错误设置为"信息"来沉默此问题,但我想知道GCC忽略的代码中是否存在错误,或者我可以做些什么来使代码分析接受代码?如果可能的话,我宁愿不要禁用这个代码分析功能,这样我就可以很容易地检测到实际的错误。
BImpl在实现什么方法方面与BDecorator有什么不同?代码分析没有抱怨BImpl,但是他们实现foo()的方式是相似的。
我想你可能需要再次索引你的代码。在项目资源管理器中右键单击项目,单击索引,然后单击刷新所有文件。这将迫使eclipse索引您的所有代码。
相关文章:
- 不理解为什么代码没有产生所需的答案
- 使用模板而不是虚拟方法的管道模式
- C++我不理解的行为
- Visual Studio代码不理解CMake-DDEBUG
- 不理解此递归函数中的返回 (C++)
- 不理解将 .pb 转换为 ff-lite 时的平均值和标准开发值
- 不理解给定代码的输出
- 为什么虚拟继承即使不涉及虚拟功能也需要 vtable?
- 为什么不调用虚拟基非默认构造函数,除非大多数派生基显式调用它们?
- 如何在不使用虚拟的情况下创建装饰器函数
- 不理解连续数字之间的空格代码
- 在特殊情况下使析构函数不是虚拟的,并删除基指针是否安全
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 将get_word转换为功能,不理解说明?
- 不是虚拟的模拟方法
- 不理解 VS 中 HelloWorld 的错误,当包含std_lib来自 Stroustrup 的书时
- 如果基方法不是虚拟方法,则调用重写的方法
- 我不理解这个dfs实现的语法
- 我不理解 std::result_of 和 decltype 的这些用法
- Eclipse CDT 的代码分析不理解虚拟继承