Domanda

Ho domanda che mi preoccupa per qualche giorno.

Astratto classe è un tipo speciale di classe che non possiamo instantiate, giusto ?. (Che è indicato / specificato dando un "= 0" ad almeno una dichiarazione di metodo, che si presenta come un ripensamento).

Quali sono i vantaggi extra che il meccanismo di classe astratta porta a C ++, che una classe base 'normale' non può raggiungere?

È stato utile?

Soluzione

Secondo la sezione Wikibooks su classi astratte :

  

E 'un modo di forzare un contratto tra il designer di classe e gli utenti di questa categoria. Se vogliamo creare una classe di cemento (una classe che può essere un'istanza) da una classe astratta che dobbiamo dichiarare e definire una funzione membro corrispondente per ogni funzione membro astratta della classe di base.

Come accennato, è un modo per definire un interfaccia a cui classi derivate devono aderire. Il loro esempio della classe astratta Vehicle è molto a proposito: che non avevo mai avere solo un Vehicle nella vita reale, si avrebbe un esploratore di Ford o una Toyota Prius, ma quelli entrambi conformarsi alle (per amor di discussione) un insieme di base di funzionalità che essere un Vehicle potrebbe definire. Ma, non si può semplicemente andare alla concessionaria Vehicle e guidare un Vehicle fuori del lotto. Così, non avresti mai vuole essere in grado di costruire e utilizzare un oggetto base Vehicle in cui ci si vuole veramente un oggetto derivato specializzata.

Altri suggerimenti

Questo offre il modo migliore in C ++ per definire un'interfaccia senza alcuna implementazione di default.

C ++ non ha C # 's concetto interface.

E 'l'equivalente di ciò che Java trasformato in "interfacce". In pratica, ciò implica che la classe stessa non è utilizzabile -. È necessario sovrascrivere tutti i metodi puri

Un esempio è classe CView di MFC che ha un metodo OnDraw pura - il CView base non fa nulla ed è come tale inutile. Devi eseguire l'override OnDraw.

(Btw -. È ancora possibile fornire un'implementazione di un metodo puro, e le implementazioni sottoclasse può cadere di nuovo esso, ma hanno ancora a fornire la propria override)

Sono usati come una classe di base in un disegno gerarchia di classi.
Le classi astratte sono usati per definire un'interfaccia pulita per tutte le classi derivate.
In fase di progettazione, le classi astratte definiscono un'interfaccia, secondo la specifica e classi derivate implementano la funzionalità desiderata di conseguenza.
Anche utilizzando le classi astratte, invece di classi "normali" aiuta a separare i dettagli di implementazione dall'interfaccia.
A implementa classe concreta un'interfaccia, ma le definisce classe astratta IT. Si potrebbe utilizzare una classe concreta come classe base nella progettazione, ma le classi astratte non sono destinati ad essere utilizzati direttamente nel codice e non può essere istanziati. Essi servono come prototipo.
Utilizzando la classe "normale", come dici tu, è necessario definire un'implementazione per tutti i metodi.

Non pensare che a livello di classe.

Guarda il metodo, e pensare a quello che dovrebbe fare nel caso di default:

virtual std::string getName() const = 0;

Quale potrebbe essere un'implementazione giusta per questo metodo? Non c'è nessuno che mi viene in mente.

Per la marcatura è "pura virtuale", si assicura che se l'utente mai ottenere un'istanza di una classe derivata da l'interfaccia, quindi questo metodo avrà un comportamento ragionevole.

L'unico altro modo per fare questo sarebbe un corpo throw NotImplemented("getName");, ma poi si sarebbe scoperta la questione in fase di esecuzione, non al momento della compilazione, che non è così bello:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top