Eclipse сообщает об ошибке при действительном наследовании cpp

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

0

Решение

C ++ имеет функцию под названием господство. Обычно, когда класс (скажем, A) происходит от двух классов (скажем, A1 а также A2каждый из которых реализует одну и ту же виртуальную функцию (скажем, void f()), производный класс должен также реализовать эту функцию. Чистая виртуальная функция также считается реализацией.

Однако есть исключение: когда A1 сам по себе получен из A2, затем A1с реализацией f() сказано доминировать это из A2и последнее исключено из рассмотрения. Таким образом, A не нужно переопределять f(),

Ваш компилятор, вероятно, не принимает это исключение во внимание. Это ошибка компилятора.

Чтобы обойти это, определите foo в Listener:

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

что некрасиво, но и ошибка компилятора.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]