Attributi di sottoclasse persi dopo re-casting

di il
2 risposte

Attributi di sottoclasse persi dopo re-casting

Buongiorno,
Al momento ho difficoltà a capire come e perchè gli attributi di una sottoclasse vengano persi dopo averli recuperati da una collection.

#include <iostream>
#include <stack>

class Poligono
 {
     public:
     int nlati;
     Poligono (int n) : nlati(n){};
     virtual void print (){
         std::cout << "sono un poligono generico." << std::endl;
     };
 };

class Quadrato : public Poligono
 {
    public:
    const char *nome;
    Quadrato(const char *str) : nome(str), Poligono(4) {};
    void print(){
        std::cout << "sono un quadrato e il mio nome e' " << nome << std::endl;
    }
 };

int main(){

    std::stack<Poligono*> poligoni; 
   
    Poligono *p = new Quadrato("pippo"); //creo la subclasse quadrato di nome pippo
    
    p->print(); //Questo poligono ritorna "sono un quadrato e il mio nome e' pippo" (giustamente)
    
    poligoni.push(p); // aggiungo il poligono in una collection, stack per esempio

    Poligono p2 = *(poligoni.top()); //in un secondo momento, ottengo il poligono precedente dallo stack
    
    p2.print(); //essendo un poligono senza alcuna informazione, ritorna "sono un poligono generico"

   //se il poligono è un quadrato lo trasformo in tale e con la print cerco di ottenere il suo nome
    if (p2.nlati==4)
         ((Quadrato) static_cast<Quadrato&>(p2)).print(); // <-- qui nome sembra non essere mai stato inizializzato

    return 0;
    }
  
    
Vorrei che tutti gli attributi specifici di Quadrato si conservassero, in questo caso solo il nome.
qualche idea?

2 Risposte

  • Re: Attributi di sottoclasse persi dopo re-casting

    
    	Poligono *p2 = poligoni.top(); 
    
    	if (p2->nlati == 4)
    		((Quadrato *)p2)->print(); 
    
  • Re: Attributi di sottoclasse persi dopo re-casting

    oregon ha scritto:


    
    	Poligono *p2 = poligoni.top(); 
    
    	if (p2->nlati == 4)
    		((Quadrato *)p2)->print(); 
    
    Vero, funziona!
    Da quel che ho capito non è necessario usare lo static_cast quando si passa da una classe derivata ad una base (casting in salita)
    ma poi ho letto che l' explicit casting qui usato fa diversi tentativi di casting tra cui lo static(?)
    Considero il problema risolto.
    tuttavia lascio alcune domande di cui sto ancora cercando una risposta
    in questo caso che tipo di casting avrà usato? funziona solo tra puntatori?
Devi accedere o registrarti per scrivere nel forum
2 risposte