Perché è una funzione virtuale pura inizializzato da 0?
-
23-09-2019 - |
Domanda
Abbiamo sempre dichiarare una funzione virtuale pura come:
virtual void fun () = 0 ;
I. e., è sempre assegnato a 0.
Quello che ho capito è che questo è per inizializzare la voce vtable questa funzione è NULL e qualsiasi altro valore qui i risultati in un tempo di compilazione di errore.È questa comprensione corretta o no?
Soluzione
Il motivo =0
viene utilizzato è quello Bjarne Stroustrup non pensava avrebbe potuto ottenere un'altra parola chiave, come ad esempio "puro" oltre il C ++ Comunità al momento la funzione è stata in fase di attuazione. Questo è descritto nel suo libro, The Design & evoluzione del C ++ , sezione 13.2 .3:
Il curioso = 0 sintassi è stato scelto ... perché al momento ho visto alcuna possibilità di ottenendo una nuova parola chiave accettata.
Si afferma anche esplicitamente che questo non deve impostare la voce vtable a NULL, e che così facendo non è il modo migliore di implementare funzioni virtuali pure.
Altri suggerimenti
Come la maggior parte "perché" domande circa la progettazione di C ++, il primo posto dove guardare è Il design e l'evoluzione del C ++ , da Bjarne Stroustrup 1 :
La sintassi
=0
curioso è stato scelto oltre l'ovvia alternativa di l'introduzione di una nuova parola chiave opure
abstract
perché al momento ho visto alcuna possibilità di ottenere una nuova parola chiave accettato. Se avessi suggeritopure
, Release 2.0 avrebbero spedito senza classi astratte. Data una scelta tra una sintassi più bello e astratto classi, ho scelto le classi astratte. Piuttosto che rischiare ritardi e incorrere nei certe lotte perpure
, ho usato la tradizione C e C ++ convenzione di usare 0 per rappresentare "Non c'è". La sintassi=0
si adatta con mio punto di vista che un corpo funzione è il inizializzatore per una funzione anche con il (semplicistico, ma solitamente sufficiente) vista della serie di funzioni virtuali essendo implementato come un vettore di puntatori a funzione. [...]
1 §13.2.3 Sintassi
Sezione 9.2 dello standard C ++ fornisce la sintassi per i membri della classe. Esso comprende questa produzione:
pure-specifier:
= 0
Non c'è niente di speciale valore. "= 0" è solo la sintassi per dire "questa funzione è puro virtuale". Non ha nulla a che fare con inizializzazione o puntatori nulli o il valore numerico pari a zero, anche se la somiglianza alle cose può avere valore mnemonico.
Non sono sicuro se c'è qualche significato dietro questo. E 'solo la sintassi del linguaggio.
C ++ ha sempre evitato l'introduzione di nuove parole chiave, dal momento che le nuove parole riservate rompono vecchi programmi che usano queste parole per gli identificatori. E 'spesso visto come uno dei punti di forza del linguaggio che rispetta vecchio codice il più lontano possibile.
La sintassi = 0
potrebbe effettivamente essere stato scelto in quanto assomiglia ad impostare una voce di vtable per 0
, ma questo è puramente simbolico. (Maggior parte dei compilatori assegnare tali voci vtable a uno stub che emette un errore prima di interrompere il programma.) La sintassi è stato scelto soprattutto perché non è stato utilizzato per qualsiasi cosa prima e ha salvato l'introduzione di una nuova parola chiave.
C ++ deve avere un modo per distinguere una funzione virtuale pura da una dichiarazione di una funzione virtuale normale. Hanno scelto di usare la sintassi = 0
. Potevano solo potuto facilmente fatto lo stesso con l'aggiunta di una parola chiave pura. Ma C ++ è piuttosto restio a aggiungere nuove parole chiave e preferisce utilizzare altri meccanismi per introdurre funzionalità.
Nulla è "initilaized" o "assegnato" zero in questo caso. = 0
in un costrutto sintattico costituito da =
e 0
gettoni, che non ha assolutamente alcuna relazione né inizializzazione o assegnazione.
Non ha alcuna relazione a qualsiasi valore reale in "vtable". Il linguaggio C ++ non ha alcuna nozione di "vtable" o anythng del genere. Varie "VTables" non sono altro che semplici dettagli di implementazioni specifiche.
Ricordo di aver letto che la giustificazione per la sintassi buffa era che era più facile (in termini di standard di accettazione) che l'introduzione di un'altra parola chiave che avrebbe fatto la stessa cosa.
Credo che questo è stato menzionato nella progettazione e nella evoluzione del C ++ da Bjarne Stroustrup.
presumo che questa è solo una parte della grammatica C ++. Non credo che ci siano limitazioni a come i compilatori attuino effettivamente tale per un determinato formato binario specifico. Non Sei assunto probabilmente era giusto per i primi giorni di compilatori C ++.
I = 0
declares un funzione virtuale pura .
Ciò che è capire è che questo è per inizializzare la voce vtable per questa funzione per nulla e qualsiasi altro valore qui si traduce in errori di compilazione
Non credo che sia vero. E 'solo una sintassi speciale. Vtable dipende dall'implementazione. Nessuno dice una voce di vtable per un membro di pura deve essere effettivamente azzerato su di costruzione (anche se la maggior parte dei compilatori gestire VTables simili).
Beh, si può anche inizializzare la voce vtable a punto di un vero e proprio"
virtual void fun()
{
//dostuff()
}
Sembra intuitivo che la voce di vtable può essere definito al punto da nessuna parte (0) o di una funzione.Che consente di specificare il proprio valore sarebbe probabilmente risultato in esso punta a spazzatura invece di una funzione.Ma che è il motivo per cui "= 0" è consentito e "= 1" non è.Ho il sospetto che Neil Butterworth è di destra circa il perché "= 0" è utilizzato a tutti