Casa Finanza personale Classi astratte e C ++ - dummies

Classi astratte e C ++ - dummies

Video: Nuovo Corso C++11 ITA 143: ereditarietà - classi astratte 2024

Video: Nuovo Corso C++11 ITA 143: ereditarietà - classi astratte 2024
Anonim

C ++ supporta late binding , che è quando risolve una chiamata al metodo basata sul tempo di esecuzione tipo (o tipo dinamico) dell'oggetto di destinazione anziché il tipo dichiarato (o il tipo statico). Questo è dimostrato nel seguente frammento di codice C ++:

# include using namespace std; Class Oven {public: virtual void cook () {cout << "cottura con forno" << endl;}}; classe MicrowaveOven: public Oven {public: virtual void cook () {cout << "cucina con forno a microonde" << endl;}}; vuoto preparazione pasti (forno e forno) {forno. cook ();}

Nella funzione prepareMeal (), la chiamata al forno. cook () può passare al forno: cook () o MicrowaveOven:: cook () a seconda del tempo di esecuzione (il tipo "effettivo") dell'oggetto del forno passato.

La parola chiave virtuale è fondamentale qui. Senza di esso, il metodo cook () verrà associato in anticipo, in base al tipo in fase di compilazione, e invocherà Oven:: cook () ogni volta. Una volta dichiarato virtuale nella classe Oven, si presume che il metodo sia virtuale in ogni sottoclasse, ma non fa male ripetere la dichiarazione in modo che i lettori capiscano.

Il seguente semplice programma dimostra in pratica questo principio:

int main () {Forno forno; prepareMeal (forno); MicrowaveOven mo; prepareMeal (mo); return 0;}

In questo programma, la chiamata a cook () genera due uscite diverse a seconda del tipo di forno:

Cottura con un forno Cottura con un forno a microonde

Non è sempre il caso, che un metodo nella classe base può essere definito. Considera più attentamente il caso del forno. Esistono diversi tipi di forni - forni tradizionali, forni a convezione e forni a microonde - ma si potrebbe sostenere che non esiste un forno effettivo che non appartiene a una di queste sottoclassi. Potresti essere in grado di dire in che modo i vari tipi di forni eseguono l'operazione di cottura, ovvero ciò che un ConventionalOven:: cook () e un MicrowaveOven:: cook () dovrebbe fare può essere definito. Probabilmente non è possibile definire quali azioni deve eseguire Forno: cook ().

Non puoi semplicemente lasciare Forno: cook () non dichiarato in un linguaggio fortemente tipizzato come C ++. Tuttavia, è possibile dichiarare un metodo, ma lasciarlo non implementato se non esiste alcuna implementazione. Uno usa la seguente sintassi curiosa per farlo:

class Oven {public: virtual void cook () = 0;};

Questo codice dichiara un metodo Forno: cook () che è legato in ritardo ma non implementa il metodo. In realtà, va oltre dicendo che il metodo non sarà implementato. In C ++, si dice che tale metodo sia puro virtuale . I programmatori C ++ usano anche il termine preferito in molti altri linguaggi di computer fortemente tipizzati: abstract .La classe del forno si dice che sia astratta.

Un riassunto rappresenta una proprietà che conosci che la classe possiede ma non sa come implementarla in modo inequivocabile nella classe corrente.

Una classe è astratta se contiene uno o più metodi virtuali puri. Il significato di questo è che non è possibile creare un'istanza di una classe astratta. Quindi non è più permesso quanto segue:

int main () {Forno forno; prepareMeal (forno); return 0;}

La ragione di questo è abbastanza semplice: se hai creato un oggetto di Class Oven e poi hai provato a invocare il forno. cook (), cosa dovrebbe fare il compilatore?

A un livello più filosofico, va bene dire che esiste un termine comune chiamato Forno che descrive forni e forni a microonde convenzionali e forni a convezione. Questo termine forno è un concetto usuale perché lega le somiglianze in tutte queste sottoclassi. Ma non esiste un'istanza di un forno che non sia una delle sottoclassi di Forno.

Una sottoclasse di una classe astratta è essa stessa astratta fino a quando tutti i metodi virtuali puri sono stati sostituiti da versioni non astratte (ovvero concrete ). Quindi la classe MicrowaveOven nel precedente frammento di codice non è astratta - anche se Oven fosse astratto - perché sovrascrive cook () con la sua versione concreta.

Si noti che non vi è nulla di sbagliato nella funzione prepareMeal () definita come segue:

void prepareMeal (Forno e forno) {forno. cook ();}

Anche se l'argomento è dichiarato essere un forno, può essere invocato solo con alcune sottoclassi di forno, come MicrowaveOven o ConventionalOven, per cui cook () è definito.

Classi astratte e C ++ - dummies

Scelta dell'editore

Come utilizzare le funzionalità dell'app Klout su dispositivi Apple - dummies

Come utilizzare le funzionalità dell'app Klout su dispositivi Apple - dummies

L'esperienza mobile di Klout è più limitato rispetto al sito web completo. Tuttavia, molte funzionalità sono ancora disponibili con l'app per dispositivi mobili, incluso dare + K ai tuoi influenzatori, controllare il tuo punteggio Klout e apportare semplici modifiche al tuo profilo. E con l'implementazione di Klout per il tuo iPhone Passbook puoi persino usare Klout per ottenere ...

Metriche dei social media: App Android SDK di Google Analytics - dummies

Metriche dei social media: App Android SDK di Google Analytics - dummies

Tracciamento delle metriche di un'applicazione ( un'app) è stata semplificata, ma le app sono ancora isolate. Puoi tenere traccia di ogni app, ma le soluzioni sono ancora in fase di creazione per tenere traccia di tutte le app. Per andare avanti con Google Analytics SDK per la tua app Android, segui questi passaggi: Scarica l'SDK di Google Analytics per Android. Aggiungi la libreria libGoogleanalytics. jar ...

Metriche sui social media: individuazione del momento di trazione con Google+ - dummies

Metriche sui social media: individuazione del momento di trazione con Google+ - dummies

In i social media, il momento di trazione potrebbe anche essere chiamato il "miglior tempo per condividere su Google+ o altri siti sociali. "Il momento migliore per te potrebbe non essere il momento migliore per i tuoi colleghi generatori di contenuti. (Il merito di questo suggerimento principale va a Christopher Penn che per primo condivise la sua osservazione sulla ricerca ...

Scelta dell'editore

Combinazione di due foto sulla tua Nikon D3400 con sovrapposizione immagini - manichini

Combinazione di due foto sulla tua Nikon D3400 con sovrapposizione immagini - manichini

L'opzione Sovrapposizione immagini sulla Il menu di ritocco di Nikon D3400 consente di unire due foto in una. Questa opzione è stata utilizzata per combinare una foto di un lupo mannaro, mostrato a sinistra, con una scena da giardino notturno, mostrata nel mezzo. Il risultato è l'immagine spettrale mostrata a destra. Oooh, spaventoso! Su ...

Scelta di una modalità Esposizione per una Nikon DSLR - manichini

Scelta di una modalità Esposizione per una Nikon DSLR - manichini

La prima impostazione da prendere in considerazione quando si le riprese con la tua Nikon D3100, D5100 o D7000 sono la modalità di esposizione, che puoi selezionare tramite la ghiera dei modi. La tua scelta determina la quantità di controllo che hai rispetto a due impostazioni di esposizione critiche - diaframma e tempo di posa - oltre a molte altre opzioni, incluse quelle relative ...

Scelta del formato immagine JPEG per una reflex Nikon - dummies

Scelta del formato immagine JPEG per una reflex Nikon - dummies

Offerte Nikon D3100, D5100 o D7000 i due tipi di file comuni nella maggior parte delle fotocamere digitali odierne: JPEG e Camera Raw, o semplicemente Raw in breve, che passa dallo specifico moniker NEF (Nikon Electronic Format) sulle fotocamere Nikon. Il tipo di file, talvolta noto anche come formato file, determina come i dati dell'immagine ...

Scelta dell'editore

Comprensione della struttura delle classi Java - dummies

Comprensione della struttura delle classi Java - dummies

Impossibile creare un'applicazione Java senza creare una classe. Tuttavia, i modi in cui si usano le classi all'inizio quando si apprendono su di essi sono stati relativamente semplicistici - Java è in grado di avere una complessità considerevolmente maggiore, che è il punto di questo capitolo. Le classi hanno una struttura specifica. Proprio come i progetti ...

Come utilizzare i metodi astratti in Java - dummies

Come utilizzare i metodi astratti in Java - dummies

Sia le interfacce che le classi astratte hanno metodi astratti in Java. Ma i metodi astratti giocano ruoli leggermente diversi in questi due tipi di tipi di riferimento. Come puoi tenere tutto dritto nella tua mente? La prima cosa da fare è ricordare che nessuno impara a conoscere i concetti di programmazione orientata agli oggetti senza ottenere molti ...

Come utilizzare l'interfaccia CharSequence in Java - dummies

Come utilizzare l'interfaccia CharSequence in Java - dummies

L'API Java include un'interfaccia utile chiamata CharSequence. Tutte e tre queste classi - String, StringBuilder e StringBuffer - implementano questa interfaccia. Questo metodo esiste principalmente per consentire di utilizzare String, StringBuilder e StringBuffer in modo intercambiabile. A tal fine, molti dei metodi delle classi String, StringBuilder e StringBuffer utilizzano CharSequence come parametro ...