Domanda

E perché non utilizzare lo stesso metodo per le funzioni non virtuali?

Voglio dire, perché fare usiamo funzioni virtuali in quel modo? Non possiamo semplicemente usarli come quelli non virtaul e li ignorare?

E se questo metodo ci sta risparmiando tempo / spazio o che cosa mai, perché non utilizzare lo stesso metodo per le funzioni non virtuali? Voglio dire che avrebbe senso che ci sarebbe stato un tavolo di funzioni per una specifica classe.

In ogni caso, grazie in anticipo, io sono solo un po 'confuso.

È stato utile?

Soluzione

Non si può avere in fase di esecuzione il polimorfismo senza usare un livello di indirezione. Questo è ciò che la vptr è per.

Il vptr non viene utilizzato per funzioni non polimorfici perché quel riferimento indiretto costa qualcosa. La filosofia di C ++ è che non si paga per ciò che non si usa.

EDIT:

Ecco alcune informazioni sul lavoro di tavoli come virtuale: http://en.wikipedia.org/wiki/Virtual_table

Altri suggerimenti

Il compilatore genera essenzialmente una chiamata diretta a metodi non virtuali. Con un metodo di chiamata virtuale, il compilatore genera il codice di ricercare l'indirizzo del metodo e poi effettua una chiamata a tale indirizzo. Così, è, in teoria, almeno un altro di ricerca quando si chiama una funzione virtuale. Non ci sarebbe alcuna ragione di correre quel costo altrimenti.

Uso vptr permette risoluzione metodo basato sul tipo di oggetto piuttosto che di tipo variabile. Non usando vptr rende le chiamate di metodo più veloce. I progettisti C ++ hanno deciso di consentire la comodità di funzioni virtuali, ma non richiedono l'penalizzazione delle prestazioni per altre funzioni.

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