C'è qualcosa?
il consiglio è BAD, non c'è dubbio su di esso. Leggere qualcosa del genere sarebbe sufficiente per stare lontano dal libro e dal suo autore.
Vedete, la parola chiave virtuale indica "è possibile o dovrebbe sovrascrivere questo metodo - è stato progettato per questo".
Per qualsiasi compito non banale, non riesco a immaginare un ragionevole sistema di classi che permetta all'utente (ad esempio un altro programmatore) di sovrascrivere ogni singolo metodo in ogni classe derivata. È normale avere una classe astratta di base con solo metodi virtuali. Tuttavia, una volta che si iniziano a creare classi derivate, non c'è motivo per dare uno schiaffo "virtuale" a tutto - alcuni metodi non hanno bisogno di essere estensibili.
Rendere tutto virtuale significa che in qualsiasi punto del codice, indipendentemente dal metodo utilizzato, non si può mai essere sicuri che la classe farà ciò che si desidera, perché qualcuno potrebbe aver annullato il metodo, interrompendolo nel processo (Secondo la legge di Murphy succederà). Ciò renderà il tuo codice inaffidabile e difficile da mantenere. Un'altra cosa molto interessante è il modo in cui i metodi virtuali vengono chiamati nei costruttori. Fondamentalmente, seguendo questo consiglio si sacrifica la leggibilità/affidabilità del codice in cambio di un errore di battitura non comune. In mia opinione, non ne vale la pena.
In confronto, il metodo non virtuale garantisce che indipendentemente da ciò che accade, a questo punto del codice, il codice funzionerà sempre come previsto (senza contare gli errori che non hai ancora scoperto). Cioè qualcun altro non sostituirà il tuo metodo con alternative rotte.
Il consiglio mi ricorda un errore comune che alcuni programmatori newbie tendono a fare: invece di sviluppare una soluzione semplice che risolverà il problema, si distraggono e tentano di rendere il codice universale ed estensibile. Di conseguenza, il progetto impiega più tempo per finire o non diventa mai completo - perché la soluzione universale per ogni scenario possibile richiede più tempo di impegno/sviluppo di una soluzione localizzata limitata solo al problema attuale.
Invece di seguire questo consiglio "virtuale", consiglierei di attenersi a Murphy's Law e KISS principle. Hanno funzionato bene per me. Tuttavia, non è garantito che funzionino bene per tutti gli altri.
Ho sentito alcune volte ma nessuno è mai riuscito a convincermi a seguirlo. Sembra un po 'fragile per me. Tendo ad essere d'accordo con la tua analisi. Ovviamente sarà sempre molto soggettivo. –
L'inclusione della prima funzione virtuale in una classe non complica la rappresentazione interna, forzando un vtable o qualcosa del genere? Avrei pensato che fosse "Vai solo virtuale quando devi davvero". –
... a meno che non si stia progettando un gioco. – Marlon