Video: Nuovo Corso C++11 ITA 139: polimorfismo - parte A 2024
Come recinzione a cavallo, il linguaggio C ++ supporta l'associazione anticipata e tardiva. Qualsiasi linguaggio di programmazione fornito può supportare l'associazione anticipata o tardiva in base ai capricci dei suoi sviluppatori. Le lingue più vecchie come la C tendono a supportare il legame precoce da solo. Lingue recenti come Java e C # supportano solo l'associazione tardiva.
Potresti essere sorpreso dal fatto che l'impostazione predefinita per C ++ sia l'associazione anticipata. L'output del programma OverloadOverride il modo in cui viene visualizzato è il seguente:
Siamo in Student:: calcTuition Siamo in Student:: calcTuition Premi Invio per continuare …
Il motivo è semplice, se un po 'datato. In primo luogo, C ++ deve agire come C possibile per impostazione predefinita per mantenere la compatibilità con il suo predecessore. In secondo luogo, il polimorfismo aggiunge una piccola quantità di sovraccarico a ogni chiamata di funzione sia in termini di memorizzazione dei dati sia di codice necessario per eseguire la chiamata.
I fondatori del C ++ erano preoccupati che qualsiasi overhead aggiuntivo sarebbe stato usato come motivo per non adottare il C ++ come linguaggio di scelta del sistema, quindi hanno reso più efficiente l'associazione anticipata del default.
Per rendere polimorfico una funzione membro, il programmatore deve contrassegnare la funzione con la parola chiave C ++ virtuale, come mostrato nella seguente modifica alla dichiarazione in OverloadOveride < programma: classe Student {public: virtual void calcTuition () {cout << "siamo in Student:: calcTuition" << endl;}};
La parola chiave
virtuale che dice a C ++ che calcTuition () è una funzione membro polimorfo. Vale a dire, dichiarare calcTuition () virtuale significa che le chiamate ad esso saranno legate in ritardo se c'è qualche dubbio sul tipo di runtime dell'oggetto con cui viene chiamato calcTuition ().
L'esecuzione del programma OverloadOveride con calcTuition () dichiarato virtuale genera il seguente risultato: Siamo in Student:: calcTuition Siamo in GraduateStudent:: calcTuition Press Invio per continuare …
Se sei a tuo agio con il debugger fornito con il tuo ambiente C ++, dovresti davvero seguire questo esempio. È così bello vedere il programma single-step in Student:: calcTuition () la prima volta che viene chiamato fn () ma in GraduateStudent:: calcTuition () nella seconda chiamata. Non puoi davvero apprezzare il polimorfismo finché non lo provi.