[Risolto]Overloading e Polimorfismo

di il
4 risposte

[Risolto]Overloading e Polimorfismo

Ciao a tutti , probabilmente il titolo non è molto chiaro quindi accetto suggerimenti anche su quello
ho un dubbio : ho queste due classi

class A 
{
	public : 
	A () :  x (0) , y ("Y")  {}
	~A () {} 
	
	friend ostream & operator << (ostream & out , const A & a ) 
	{
		out << "Parametro x " << a.x << "\nParametro y " << a.y ; 
		return out ;
	}
	
	private :
	int x ; 
	char y ; 
};
class B : public A
{
	public : 
	B () : A (int _x , char _y) , z (1) {}
	private : 
	
	friend ostream & operator << (ostream & out , const B & b ) 
	{
		out << "Parametro x " << b.x << "\nParametro y " << b.y <<"\nParametro z" << b.z ;  
		return out ;
	}
	unsigned z ;  
}
mettiamo che nel main mi ritrovo questo

	A * var = new B () ; 
	cout << * var ; 
se faccio questo l'operatore ridefinito che viene richiamato è quello della classe A perchè il puntatore è di tipo A .
il fatto è che io voglio che venga chiamato quello della classe B .
mi potreste gentilmente spiegare come fare( ed eventualmente correggermi )?

4 Risposte

  • Re: [Risolto]Overloading e Polimorfismo

    Il codice è tutto sbagliato e non compila nemmeno. Inoltre con
    
    cout << var;
    
    viene solo visualizzato un indirizzo di memoria e non richiamata una funzione, che in ogni caso non appartiene alla classe e pertanto non può essere poliforma.
  • Re: [Risolto]Overloading e Polimorfismo

    Il codice che ho scritto ha lo scopo di rendere l'idea di quello che devo fare . anche per logica lo si dovrebbe capire
    comunque se bisogna essere fiscali in questo lo modificherò anche se a mio parere la tua risposta mia sa tanto di "incrementa contatore messaggi" .
    d'ora in poi farò più attenzione

    comunque se bisogna essere fiscali vedi che hai letto male perchè var è il nome della VARiabile puntatore che punta ad un oggetto di tipo A quindi leggi meglio
  • Re: [Risolto]Overloading e Polimorfismo

    Libero di pensarla come vuoi.
    Resta il fatto che il codice ancora non compila.
    Il perché nei commenti.
    
    class A
    {
       public :
       /* "Y" è una stringa, non un carattere. Corretto è
       A () :  x (0) , y ('Y')  {} con singoli apici, non doppi
       */
       A () :  x (0) , y ("Y")  {} 
       ~A () {}
       
       friend ostream & operator << (ostream & out , const A & a )
       {
          out << "Parametro x " << a.x << "\nParametro y " << a.y ;
          return out ;
       }
       
       /* i parametri private di A non sono accessibili da B. 
           Devono almeno essere protected 
       */
       private :
       int x ; 
       char y ;
    };
    class B : public A
    {
       public :
       /* a parte il fatto che manca il costruttore parametrico in a, 
           si devono passare valori al costruttore, non tipi di dato. 
           Questa cosa  B () : A (int _x , char _y) , z (1) {} non ha senso.
           Corretto sarebbe:
       B () : A (10 , 'c') , z (1) {}
       */
       B () : A (int _x , char _y) , z (1) {}
    
       private :
       
       friend ostream & operator << (ostream & out , const B & b )
       {
          out << "Parametro x " << b.x << "\nParametro y " << b.y <<"\nParametro z" << b.z ; 
          return out ;
       }
       unsigned z ; 
    }
    

    Se vuoi il comportamento che ti interessa devi aggiungere una funzione polimorfa alla quale passare solo ostream&.
    Riveduto e corretto il tutto diventa:
    
    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
    	A() : x(0), y('Y') {}
    	A(int _x, char _y) : x(_x), y(_y) {}
    	virtual ~A() {}
    
    	friend ostream & operator << (ostream & out, const A & a)
    	{
    		a.print(out);
    		return out;
    	}
    
    
    protected:
    	int x;
    	char y;
    	virtual void print(ostream& out) const {
    		out << "Parametro x " << x << "\nParametro y " << y;
    	}
    };
    
    class B : public A {
       public:
    	   B() : A(10, 'B'), z(1) {}
       private:
    
    	   virtual void print(ostream& out) const {
    		   out << "Parametro x " << x << "\nParametro y " << y << "\nParametro z" << z;
    	   }
    	   unsigned z;
    };
    
    int main(int argc, char* argv[]) {
    
    	A* var = new B();
    	cout << *var;
    	delete var;
    }
    
    comunque se bisogna essere fiscali vedi che hai letto male perchè var è il nome della VARiabile puntatore che punta ad un oggetto di tipo A quindi leggi meglio
    Oh, io ho letto benissimo. Tanto più che errori simili si sgamano in 0,1 petosecondi dato che molta gente (agli inizi) pensa che basti agire su un puntatore per ottenere l'effetto che vuole.
    Alla prossima
  • Re: [Risolto]Overloading e Polimorfismo

    Questa risposta è più utile rispetto alla precedente .
    gli errori di sintassi (in particolar modo i doppi apici al posto dei singoli, ultimamente sto usando solo string e mi è venuto istintivo mettere quelli ) sono dovuti al fatto che ho scritto direttamente il codice sul forum senza prima sottometterlo e magari alcuni non li avrei commessi .
    ho alzato un pò i toni perchè mi sono sentito preso in giro e per questo devo chiederti scusa , non è da me ma ultimamente sono un po frustrato per via del c++ in particolare .

    cadute di stile a parte volevo aggiungere che (ovviamente) non sapevo e oltretutto non avevo pensato a passare l'ostream ad una funzione .
    proverò ad implementare il tutto e se dovesse funzionare metterò [Risolto] al post .
    grazie comunque della risposta , a presto

    p.s. ho modificato il titolo , adesso dovrebbe essere più intuitivo l'argomento
Devi accedere o registrarti per scrivere nel forum
4 risposte