PDA

View Full Version : [c++]ereditarietà e ridefinizione degli operatori


Sabonis
14-07-2008, 16:21
class Mystring: public std::string{
public:
Mystring(){
}
};

int main()
{
Mystring a,b;
a=b;

Mystring s;
s = "mamma";
}
compilando questo codice ottengo:
error: no match for 'operator=' in 's = "mamma"'
Come mai funziona il primo assegnamento e non il secondo? Non vengono ereditati gli operatori ridefiniti? (in questo caso parlo di quelli ridefiniti in std::string). Ma allora come mai funziona il primo assegnamento?Viene utilizzata la copia di default membro a membro?

Sabonis
14-07-2008, 17:14
Si ma io posso fare questo:
std::string st = "babbo";

Mi sembra strano che non si possa fare con Mystring

71104
14-07-2008, 20:47
Si ma io posso fare questo:
std::string st = "babbo";

Mi sembra strano che non si possa fare con Mystring a me sembra perfettamente normale invece: la tua classe Mystring non ha nessun costruttore con un argomento di tipo const char*, che è quello che verrebbe usato da quel tipo di inizializzazione.

Sabonis
14-07-2008, 21:08
Come al solito ho trovato un esempio sbagliato e vi sto confondendo.
Non parlavo del costruttore ma dell'opearatore =

Con la classe std::string posso fare:
std::string a;
a = "mamma";

Ma non posso farlo con la classe Mystring, perchè? Immagino che la classe std::string abbia una funzione tipo operator= ( const char * str ), questa funzione non dovrebbe essere ereditata da Mystring?

banryu79
15-07-2008, 14:54
Ma non posso farlo con la classe Mystring, perchè? Immagino che la classe std::string abbia una funzione tipo operator= ( const char * str ), questa funzione non dovrebbe essere ereditata da Mystring?

No, l'assignement operator della classe base non viene ereditato dalla sottoclasse: se nella sottoclasse non viene fatto l'overloading esplicito dell'assignement operator della classe base allora quest'ultimo viene "nascosto" dal copy assignement operator.

Se vuoi fare

Mystring mst = "babbo";

allora devi fare l'overloading dell'operator.