0

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;
}
4

1 回答 1

0

C++ 有一个称为优势的特性。通常,当一个类 (say A) 派生自两个类 (sayA1A2) 时,每个类都实现相同的虚函数 (say void f()),派生类也需要实现该函数。纯虚函数也算作实现。

但是,有一个例外:当A1本身派生自时A2,则A1s 的实现f()被称为支配的实现A2,而后者被排除在考虑之外。因此,A不必重新实现f()

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

要解决它,请foo定义Listener

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

这很丑陋,但编译器错误也是如此。

于 2012-09-14T21:51:54.840 回答