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?

È stato utile?

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 o pure   abstract perché al momento ho visto   alcuna possibilità di ottenere una nuova parola chiave   accettato. Se avessi suggerito pure,   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 per   pure, 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 = 0declares 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

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