Eclipse报告了有效cpp继承的错误

Eclipse reports bug on valid cpp inheritance

本文关键字:继承 错误 cpp 有效 报告 Eclipse      更新时间:2023-10-16

Eclipse报告了"new Listener()"上的一个错误,尽管它是用g++编译和执行的。请注意,这些类的数据比这里列出的要多,因为这是经过修剪的,所以删除看似空的类不是一个选项。有什么可以添加/更改的东西可以让Eclipse和g++都满意吗。不过,我将无法更改Base*类。

class BaseIntf {
public:
    virtual ~BaseIntf() {}
    virtual void foo() = 0;
};
class BaseImpl: public virtual BaseIntf {
public:
    virtual void foo() {}
};
class ListenerBaseInft: public virtual BaseIntf {
};
class Listener: public ListenerBaseInft, public BaseImpl {
};
int main(int argc, char *argv[]) {
    // Eclipse:
    // The type 'Listener' must implement the inherited pure virtual method 'BaseIntf::foo'
    Listener* listener = new Listener();
    listener->foo();
    return 0;
}

C++有一个称为优势的特性。通常,当一个类(比如A)是从两个类(比方说A1A2)派生的,每个类都实现相同的虚拟函数(比如说void f())时,派生的类也需要实现该函数。纯虚拟函数也算是一种实现。

然而,有一个例外:当A1本身是从A2派生而来时,则A1f()的实现被称为主导A2的实现,而后者被排除在考虑之外。因此,A不必重新实现f()

您的编译器可能没有考虑到该异常。这是一个编译器错误。

要解决此问题,请在Listener:中定义foo

void foo() { BaseImpl::foo(); }

这很难看,但编译器错误也是如此。