[OO/C++] metodi virtuali e ereditarietà a catena

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
duchamp
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 560
Iscrizione: venerdì 10 agosto 2007, 19:55

[OO/C++] metodi virtuali e ereditarietà a catena

Messaggio da duchamp »

Ciao a tutti. Ho il seguente scenario in più-o-meno-pseudocodice:

Codice: Seleziona tutto

class entità {
   virtual void corri();
};

class umano : public entità {
    void corri();
};

class donna : public umano {
   void corri();
};
Quando vado ad implementare umano::corri(), il metodo corri() che umano ha ereditato da entità viene overloaded (come si dice in italiano? :D), perchè virtuale. Ma al momento dell'implementazione di donna::corri() cosa succede? Se volessi overloadare tale metodo, anche umano::corri() dovrebbe essere virtuale? Se invece lo lasciassi inalterato così come nell'esempio?
Vi ringrazio in anticipo!
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [OO/C++] metodi virtuali e ereditarietà a catena

Messaggio da 1001001 »

Ciao!
Prima di tutto, in questo caso si parla di override e non overload :D
Detto questo, una cosa importante va messa subito in chiaro: quello che tu dici/chiedi vale solo se stiamo trattando referenze/puntatori alla gerarchia. Quello che voglio dire è che se fai:

Codice: Seleziona tutto

donna d;
d.corri ();
viene chiamato il metodo della classe donna, virtuale o no che sia.
Se invece hai un puntatore alla classe base:

Codice: Seleziona tutto

entità e = new donna;
e->corri ();
(gli accenti nel codice sorgente non si potrebbero mettere, ma considera anche il mio come più-o-meno-pseudocodice :) )
allora sì che il virtual entra in gioco. Se infatti il metodo non è dichiarato virtuale, verrà chiamato quello della classe entita. Se il metodo è virtuale invece la "virtualità" viene propagata implicitamente alle sue ridefinizioni nelle classi derivate. Quindi anche se corri () non fosse virtual in umano (essendo però virtual in entità) il metodo della classe donna verrebbe chiamato.
Detto questo, il mio consiglio è di dichiarare virtual anche i metodi delle classi derivate, sia perché alcuni compilatori (google tells me) si lamentano con dei warning se non lo fai sia (soprattutto) per chiarezza del codice :)
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti