Como faço para declarar um operador sobrecarregado em uma classe abstrata e substituí-lo em uma classe não-abstrata derivada?

Estou tentando escrever uma classe abstrata com alguns operadores binários virtuais puros, que devem ser implementados pela classe derivada para realizar o polimorfismo do operador. Aqui está um exemplo simplificado:

class Base {
public:
    virtual const Base& operator+ (const Base&) const = 0;
};

class Derived : public Base {
public:
    const Derived& operator+ (const Derived&) const;
};

const Derived& Derived::operator+ (const Derived& rvalue) const {
    return Derived();
}

Não importa agora o que o operador faz, a parte importante é o que ele retorna: ele retorna um objeto Derivado temporário ou uma referência a ele. Agora, se eu tentar compilar, recebo isto:

test.cpp: In member function ‘virtual const Derived& Derived::operator+(const Derived&) const’:
test.cpp:12:17: error: cannot allocate an object of abstract type ‘Derived’
test.cpp:6:7: note:   because the following virtual functions are pure within ‘Derived’:
test.cpp:3:22: note:    virtual const Base& Base::operator+(const Base&) const

O que há de errado? O operador + não é (a única função virtual pura na Base) sendo substituída? Por que o derivado deve ser abstrato também?

questionAnswers(2)

yourAnswerToTheQuestion