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?