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
) происходит от двух классов (скажем, A1
а также A2
каждый из которых реализует одну и ту же виртуальную функцию (скажем, void f()
), производный класс должен также реализовать эту функцию. Чистая виртуальная функция также считается реализацией.
Однако есть исключение: когда A1
сам по себе получен из A2
, затем A1
с реализацией f()
сказано доминировать это из A2
и последнее исключено из рассмотрения. Таким образом, A
не нужно переопределять f()
,
Ваш компилятор, вероятно, не принимает это исключение во внимание. Это ошибка компилятора.
Чтобы обойти это, определите foo
в Listener
:
void foo() { BaseImpl::foo(); }
что некрасиво, но и ошибка компилятора.
Других решений пока нет …