0

Eclipseは「newListener()」に関するバグを報告していますが、これは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++ にはdominanceと呼ばれる機能があります。通常、クラス (たとえばA) が 2 つのクラス (たとえばA1およびA2) から派生し、それぞれが同じ仮想関数 (たとえばvoid f()) を実装している場合、派生クラスもその関数を実装する必要があります。純粋仮想関数も実装としてカウントされます。

ただし、例外があります。 がA1から派生したA2場合、A1の実装は の実装を支配するf()と言われ、後者は考慮から除外されます。したがって、を再実装する必要はありません。A2Af()

あなたのコンパイラはおそらくその例外を考慮に入れていません。コンパイラのバグです。

これを回避するには、 in で次のように定義fooListenerます。

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

これは醜いですが、コンパイラのバグもそうです。

于 2012-09-14T21:51:54.840 に答える