salve a tutti!
ho cercato per due ore qualche chiarimento su un problema che ho, nel mio apprendimento "rapido" del C++, ovvero lo slicing su dei valori di ritorno. Anticipo che sto lavorando su liste ed alberi con dei programmi d'esempio che spero mi facciano capire bene come funzionano certe cose che nella mia attività di programmatore a livello più alto (o più basso, a seconda dei casi) avevo sempre trascurato.
1. Innanzitutto ho due classi container "Lista" e la sua classe derivata "Albero". Poi ho due strutture dati: "Nodo" (che contiene appena un intero) e "Foglia" (che contiene qualche informazione in piu'). Come il nome suggerisce, per memorizzare i nodi ho creato una lista linkata singolarmente: ogni Nodo (e quindi ogni Foglia) contiene un puntatore al Nodo successivo.
2. In Lista ho un metodo add(int i) che aggiunge un nodo. Tale metodo crea, al suo interno, un oggetto Nodo e lo aggiunge alla linked list che, effettivamente, è interna a Lista. Restituisce il puntatore a Nodo del nodo appena creato.
NODO|pNodo--->NODO|pNodo---->NODO|pNodo
3. In Albero ho un metodo add(int i, int colore) che è molto simile al precedente. Esso crea degli oggetti Foglia (che come ho gia' detto sono dei Nodo arricchiti) e restituisce un pNodo alla Foglia appena creata. Poiché Foglia è derivata da pNodo *CREDO* di poter usare un puntatore a Nodo anche per linkare le foglie...è giusto o così vado soggetto a slicing?
FOGLIA|pNodo--->FOGLIA|pNodo--->...
4. Inoltre, usando il metodo add(int) su Albero (diciamo che ci sono delle foglie senza colore) ottengo una lista "ibrida"
FOGLIA!pNodo--->FOGLIA|pNodo--->NODO|pNodo--->FOGLIA|pNodo--->...
che però non è quello che voglio...supponiamo infatti che voglia navigare l'albero per recuperare i colori di tutte le foglie...appena arrivo a NODO mi trovo un bel colore garbage. Attualmente ho definito add(int) di Lista come virtual e ho ridefinito add(int) anche per Albero in modo che allochi un FOGLIA non un NODO...ma è giusto così?



Rispondi quotando
faccio qualche altro tentativo e poi posto eventuali altre richieste di chiarimenti...
