Video: CRYPTO - VIDEO 13 - Classi astratte 2024
Una classe astratta in C ++ è una classe con una o più funzioni pure virtuali. Una funzione pura virtuale è una funzione membro virtuale contrassegnata come priva di implementazione. Molto probabilmente non ha implementazione perché nessuna implementazione è possibile con le informazioni fornite nella classe, comprese eventuali classi base.
Una funzione virtuale non pura convenzionale, run-of-the-mill è conosciuta come una funzione concreta (si noti che una funzione concreta può essere virtuale - sfortunatamente, C ++ usa questo termine per indicare polimorfico.
La sintassi per dichiarare una funzione pure virtual è dimostrata nella seguente classe Account:
// Account - questa classe è una classe astratta class Account {public: Account (non firmato accNo, double initialBalance = 0. 0); // accesso funzioni unsigned int accountNo (); double acntBalance (); static int noAccounts (); // transaction functions void deposit (double amount); // il seguente è una pura funzione virtuale virtuale annullamento del vuoto (doppio importo) = 0; protetto: // mantenere gli account in un elenco collegato in modo che non ci sia limite // al numero di conti conteggio statico int; // numero di account conto terzi non firmato;;};
Il = 0 dopo la dichiarazione di ritiro () indica che il programmatore non intende definire questa funzione. on è un segnaposto per le sottoclassi. Le sottoclassi di Account dovrebbero sostituire questa funzione con una funzione concreta. Il programmatore deve fornire un'implementazione per ogni funzione membro non dichiarata virtuale pura.
Alcuni programmatori pensano che questa notazione sia sciocca. Ma è qui per restare, quindi devi solo imparare a conviverci. C'è una ragione, se non esattamente una giustificazione, per questa notazione. Ogni funzione virtuale deve avere una voce in una tabella speciale.
Questa voce contiene l'indirizzo della funzione. Presumibilmente, almeno una volta, la voce per una pura funzione virtuale era 0. In ogni caso, è la sintassi con cui sei bloccato ora.
Una classe astratta non può essere istanziata con un oggetto; cioè, non puoi creare un oggetto da una classe astratta. Ad esempio, la seguente dichiarazione non è legale:
void fn () {// dichiara un account con 100 dollari Account acnt (1234, 100. 00); // questo non è legale. ritiro (50); // cosa ti aspetteresti} // questo invito a fare?
Se la dichiarazione fosse permessa, l'oggetto risultante sarebbe incompleto, privo di alcune capacità. Ad esempio, che cosa dovrebbe fare la chiamata precedente? Ricorda, non esiste un account:: ritiro () .
Le classi astratte servono come classi base per altre classi. Un account contiene tutte le proprietà associate a un conto bancario generico. È possibile creare altri tipi di conti bancari ereditando dall'account .
Il termine tecnico è istanziare . Si dice che la classe Account non può essere istanziata con un oggetto o un dato oggetto istanzia la classe Risparmio .