Newsgroup: it.comp.lang.c++
Titolo: da base a derived

Salve a tutti, vorrei porre il seguente quesito.
Siano date due classi, A e B, con B derivata da A, sia inoltre
dato un container che detiene puntatori alla classe A.
Supponiamo che a run-time, ad un certo punto, tutti i puntatori
del container puntino effettivamente ad oggetti di classe A.
Si vuole, ora, che alcuni oggetti diventino di tipo B.
Mi chiedevo quali potessero essere le soluzioni.
Pensavo, in maniera brutale, di risolvere il problema con questa
sequenza di operazioni:
1) Creare un nuovo oggetto di tipo B;
2) deallocare l'oggetto A;
3) assegnare il puntatore che puntava al
   vecchio oggetto A al nuovo oggetto B.
Non so se questa sequenza sia corretta.
In ogni modo come potrei trasferire i dati contenuti nel vecchio
oggetto A verso il nuovo oggetto B, senza doverli copiare uno ad uno ?
Ciao e grazie.
f

    vecchio oggetto A al nuovo oggetto B.
quando deallochi A, la memoria occupata da A e', per il sistema operativo,
libera
e quindi puo' essere utilizzata per qualsiasi cosa nelle fasi successive.
Quindi mi
sa che non puoi fare quello che hai scritto.
Piuttosto: quante classi di tipo B hai? Se son piu' di una, e devi avere
B(i) per chiamare
un metodo che e' comune a tutte le B(i), come nome ma non come
implementazione,
usa la tecnica delle funzioni virtuali (polimorfismo). Ovviamente funziona
anche con una sola classe derivata.
Se devi avere B(i) per altri motivi, e sai di quale delle B(i) hai bisogno,
a compile time,
puoi usare, credo, un dynamic cast, ovvero, senza troppi formalismi,
B* pb = dynamic_cast<B*>(pA);
naturalmente pA deve puntare a un oggetto di tipo B, cioe' deve essere una
cosa del tipo: pA = new B.
Se la B(i) la sai a run time......boh?


 oggetto A verso il nuovo oggetto B, senza doverli copiare uno ad uno ?
Bč, semplicemente metti in B un costruttore che prenda come parametro un
oggetto A.
FBF

 oggetto A verso il nuovo oggetto B, senza doverli copiare uno ad uno ?
Con un costruttore di copia apposito definito nella classe B.
EMG

 sa che non puoi fare quello che hai scritto.
se ho:
pA* A = new A();
...dopodiche' facccio
delete pA;
...e quindi
pA = new B();
e' un'operazione scorretta ?

 sa che non puoi fare quello che hai scritto.
L'amico parla di riutilizzare il puntatore non la memoria da esso
puntata, operazione perfettamente lecita in quanto B è derivata da A e
il puntatore è un A*.
EMG

 e' un'operazione scorretta ?
Correttissima.
EMG

Non so se questa sequenza sia corretta.
NI...
Se ti interessa preservare solo lo stato va bene,
ma un oggetto e` determinato anche dalla sua
identita`. In C++ non e` possibile cambiare il
tipo di un oggetto. La soluzione va cercata
appositamente per il problema specifico, in particolare
quando ti interessa in qualche modo preservare
una certa identita`.
Nel caso piu` semplice (l'identita` non ti interessa)
puoi fare letteralmente
quanto tu stesso hai pensato, potresti
definire un costruttore per B che prenda come parametro
un oggetto di classe A:
B::B(const A& a) : A(a) {
  /*  op. specifiche di B */
}
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

e' ovviamente corretta....
scusate se non avevo capito bene!
tib

Volevo ringraziare i colleghi del NG che con
i loro consigli mi hanno aiutato in questa situazione.
Grazie mille.
Francesco