Funzioni virtual

di il
73 risposte

Funzioni virtual

Salve a tutti, mi potreste spiegare il perché quando si fa uso del polimorfismo tra una classe base e una derivata bisogna usare funzioni virtual; e poi che sono le classi astratte

73 Risposte

  • Re: Funzioni virtual

    Ciao dna_programmer,
    Quando dichiari una funzione virtual informi il compilatore che la chiamata a qualla funzione va effettuata in modo particolare. Nel codice che viene compilato non viene inserito un salto a quella funzione (come si fà normalmente) ma viene inserito un meccanismo particolare (consulta una tabella chiamata VMT) e il collegamento a quale funzione saltare verrà stabilito a run-time.

    Viene chiamata classe astratta una classe che contiene almento una funzione virtuale pura, ovvero una funzione di cui non è stato definito il corpo. Non è possibile istanziare una classe astratta, bisogna per forza usare una classe derivata (in cui il metodo è stato definito).
  • Re: Funzioni virtual

    Ciao, la classe astratta ora mi è chiara, l'unica cosa non ho capito bene cosa si intende che il collegamento viene stabilito a run-time
  • Re: Funzioni virtual

    Ecco un esempio:
    
    #include <iostream>
    #include <string.h>
    #include <conio.h>
    
    using namespace std;
    
    class Animale
    {
    public:
    	virtual void Parla() = 0;
    };
    
    class Gatto: public Animale
    {
    public:
    	virtual void Parla()
    	{
    		cout << "Miao" << endl;
    	}
    };
    
    class Cane: public Animale
    {
    public:
    	virtual void Parla()
    	{
    		cout << "Bau" << endl;
    	}
    };
    
    int main()
    {
    	Animale* animale = NULL;
    
            // supponi che qui ci sia una condizione qualsiasi, ad esempio legge un file per fare la scelta
    	if (true) 
    		animale = new Gatto();
    	else
    		animale = new Cane();
    
    	animale->Parla();
    
    	return 0;
    }
    
    La scelta dell' animale avviene a run-time, quindi l' istruzione 'animale->Parla()' chiamerà funzioni differenti in base alla scelta fatta, il collegamento con la funzione non è stabilito a priori (mentre normalmente lo è).
  • Re: Funzioni virtual

    Ma il fatto di usare un puntatore a oggetto(e quindi oggetti dinamici) è stata una scelta tua oppure con le funzioni virtuali bisogna per forza fare in questo modo?
  • Re: Funzioni virtual

    Se vuoi usare il polimorfismo devi passare per i puntatori.
    Il concetto è: ti tieni un puntatore ad una classe base e le assegni una qualche classe derivata. Poi usi i metodi della classe base, ad esempio il metodo 'Parla', e a seconda di che cosa sta puntando il comportamento sarà diverso.
  • Re: Funzioni virtual

    Ma perché non posso usare il polimorfismo anche senza puntatori, cioè ad esempio usando l'override e quindi dichiaro in una classe derivata un metodo uguale di nome a uno che sta nella classe base e ci cambio il comportamento
  • Re: Funzioni virtual

    Sono due cose diverse, le usi in due modi diversi e per scopi diversi.
    Niente ti vieta se hai la classe Animale col metodo Parla, di dichiarare un Gatto che fà l' override del metodo Parla (non è neppure necessario il virtual), poi istanzi un Gatto e ne richiami Parla.
    Funziona tutto, semplicemente non è polimorfismo è l' override di un metodo.
  • Re: Funzioni virtual

    Allora non ho capito, cioè io pensavo che col polimorfismo può usare o overloading o l'overriding, ciò un po' di confusione, mi potresti spiegare le differenze gentilmente
  • Re: Funzioni virtual

    Provo a farti delle domande, l' argomento richiede pazienza.

    Supponi di voler fare uno zoo, come fai? Il numere e tipo di animali è variabile. (hai 30 sec per rispondere )
  • Re: Funzioni virtual

    Bhè credo di si
  • Re: Funzioni virtual

    Siccome hai un insieme variable di elementi ti servirà una lista o un array a dimensione variablie.

    Per comodità usiamo uno pseudo-linguaggio, basta che ci capiamo

    List of Animali: animali;

    poi quando vuoi ad esempio fare una azione su ogni animale, cicli sulla lista e ne richiami un metodo comume:
    
    Foreach animale in animali 
      animale.Muovi
    
    Fin qui ci siamo?
  • Re: Funzioni virtual

    Fin qui ok
  • Re: Funzioni virtual

    Nell' esempio precedente bisogna notare che abbiamo a che fare con una lista di elementi di cui non si conosce il tipo esatto, gli animali che verranno inseriti nella lista saranno si, cani e gatti, ma la lista è una lista di animali, cioè di elementi della classe base.

    Quindi siamo in una situazione molto diversa dall' aver istanziato uno specifico animale e richiamato un suo metodo. Il compilatore non sa che animali decideremo di inserire e quindi non conosce i metodi che verranno richiamati.

    Questo collegamento particolare che avviene a run time si chiama polimorfismo, e richiede l' uso di puntatori e della clausola virtual.

    L' argomento è forse quello più ostico della programmazione ad oggetti (ma anche il più importante) non avere fretta, ci vuole del tempo per digerirlo, se non sono stato chiaro (questo lo so gia ) vedrò di spiegarmi meglio.
  • Re: Funzioni virtual

    Ti ringrazio come sempre per la tua disponibilità. Allora partiamo dalla base:
    una cosa è il polimorfismo e un'altra cosa sono l'override e l'overloading giusto?
Devi accedere o registrarti per scrivere nel forum
73 risposte