Supponiamo che io ho una classe base astratta, che appena definisce un contenitore su cui può essere eseguita Inoltre:Qual è il modo corretto per sovraccaricare gli operatori in classi base astratte?
class Base {
public:
virtual ~Base() {}
virtual Base operator+(const Base& rhs) =0;
};
poi voglio sottoclassi di base per fornire l'effettivo funzionamento:
class Derived: public Base {
public:
Base operator+(const Base& rhs) { // won't compile
// actual implementation
}
};
Ecco il mio problema: operator +() dovrebbe restituire un nuovo oggetto Base, ma Base essendo astratto non verrà compilato.
Ho cercato di aggirare questo usando una fabbrica per restituire un riferimento ad un oggetto Base, ma poi nel corpo dell'operatore mi trovo a fare calchi, perché l'aggiunta ha senso solo sugli oggetti derivati.
In ogni caso, mi sento come se mi stessi mordendo la coda, c'è una soluzione adeguata a questo?
AGGIORNAMENTO: Sulla base delle risposte finora, sembra che sto usando il modello sbagliato. Voglio separare l'interfaccia dall'implementazione, così che il codice della libreria deve solo conoscere l'interfaccia e il codice client fornisce l'implementazione. Ho cercato di farlo fornendo l'interfaccia come una classe base astratta e l'implementazione come sottoclassi.
UPDATE2: La mia domanda era in realtà 2 domande, una concreta (circa l'overloading degli operatori in classi astratte) e un'altra sulle mie intenzioni (come posso consentire al client di personalizzare l'implementazione). Il primo ha avuto risposta: no. Per quest'ultimo, sembra che il modello di classe di interfaccia che uso sia effettivamente valido per risolvere il problema (secondo lo Griffiths and Radford), è solo che non dovrei fare casino con gli operatori sovraccaricati.
Ah, un compagno /. reader – John