Supongamos que tengo una clase base abstracta, que simplemente define un recipiente en el que se puede realizar además:¿Cuál es la forma correcta de sobrecargar a los operadores en clases base abstractas?
class Base {
public:
virtual ~Base() {}
virtual Base operator+(const Base& rhs) =0;
};
entonces quiero subclases de base para proporcionar la operación real:
class Derived: public Base {
public:
Base operator+(const Base& rhs) { // won't compile
// actual implementation
}
};
Aquí está mi problema: operador +() se supone que devuelve un nuevo objeto Base, pero como Base es abstracto, no se compilará.
Intenté evitarlo utilizando una fábrica para devolver una referencia a un objeto Base, pero luego en el cuerpo del operador me encuentro haciendo moldes, porque la adición solo tiene sentido en los objetos Derivados.
En cualquier caso, parece que me estoy mordiendo la cola, ¿hay una solución adecuada para esto?
ACTUALIZACIÓN: Basado en las respuestas hasta ahora, parece que estoy usando el patrón incorrecto. Quiero separar la interfaz de la implementación, por lo que el código de la biblioteca solo debe conocer la interfaz y el código del cliente proporciona la implementación. Traté de hacerlo al proporcionar la interfaz como una clase base abstracta y la implementación como subclases.
ACTUALIZACIÓN2: Mi pregunta era en realidad de 2 preguntas, una concreta (sobre operadores de sobrecarga en clases abstractas) y otra sobre mi intención (cómo le permití al cliente personalizar la implementación). El primero ha sido respondido: no. Para este último, parece que el patrón de clase de interfaz que uso es realmente bueno para resolver ese problema (de acuerdo con Griffiths and Radford), es solo que no debería meterme con los operadores sobrecargados.
Ahh, un compañero /. lector – John