Salve, volevo chiedere un chiarimento circa il comportamento polimorfo di una funzione di stampa. In particolare Ho una gerarchia di opere d arte: la classe base è scheda da cui derivano: opere scultoree (La chiamerò OperaS)ed opere Pittoriche (la chiamerò OperaP). Mi si chiedeva di implementare un Catalogo di schede avente un titolo con rappresentazione mediante un array allocato dinamicamente e di prevedere un' operatore che stampasse i dati relativi all' opera. Per far cio ho dapprima implementato nelle classi OperaS, OperaP e scheda una funzione Print in modo tale che essa sia virtual e poi nei rispettivi operatori di shift ho richiamato tale funzione Print.
Classe Scheda
class Scheda{
friend ostream & operator<<(ostream &,const Scheda &);
friend istream & operator>>(istream &,Scheda &);
private:
char * Titolo;
char * Descrizione;
static const int N=10;
char Codice [N];
Autore Aut;
virtual void Print (ostream &)const;
Implementazione Print e operatore di shift:
void Scheda::Print (ostream & out)const{
out << Titolo << ' ' << Descrizione << ' ' << Codice << ' ' << Aut;
}
ostream & operator<<(ostream & out,const Scheda & S){
S.Print(out);
return out;
}
Mentre per la classe OperaP(riporto solo l' implementazione della print e dell oepratore di shift di una sola derivata, in quanto dell' altra derivata OperaS il procedimento è analogo):
void OperaP::Print (ostream & out)const{
out << (Scheda)*this << ' ' << Tecnica << Tipo;
}
ostream & operator<<(ostream & out,const OperaP & O){
O.Print(out);
return out;
}
Mentre per la classe Catalogo ho implementato semplicemente quest operatore di shift che riesce a stampare qualsiasi elemento della gerarchia.
class Catalogo{
friend ostream & operator << (ostream &,const Catalogo &);
private:
char * Titolo;
T * V;
int nelem;
int riemp;
ostream & operator << (ostream & out,const Catalogo & C){
for(int i=0;i<C.riemp ; i++) out << *C.V[i] << std::endl;
return out;
}
La mia domanda era la seguente: E' cosi che bisognava fornire un uso polimorfo dell' operatore di shift per quanto riguarda le classi Scheda-OperaP in modo che Catalogo stampi tutte le info necessarie?
Inoltre l' upcasting che io eseguo nella Print di OperaP è il seguente:
(Scheda)*this
Tuttavia negli operatori di shift o in altre circostanze la prof ci faceva fare l' upcasting di un oggetto in questo modo
(Base&)Oggetto
Nel caso di OperaP se seguissi l' upcasting fatto dalla prof ossia facessi
(Scheda&)*this
, il programma mi va in crash.
Non riesco a capire il perchè di questa differenza e non riesco a spiegarmi il perchè il mio upcasting non da alcuna sorta di errore.
Grazie in anticipo