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