¿Hay algo a ella?
El consejo es BAD, no hay dudas al respecto. Leer algo así sería suficiente para mantenerse alejado del libro y su autor.
Verá, la palabra clave virtual indica "puede o debe anular este método, fue diseñado para esto".
Para cualquier tarea no trivial, no puedo imaginar un sistema razonable de clases que permita al usuario (es decir, a otro programador) anular todos y cada uno de los métodos en todas las clases derivadas. Es normal tener una clase abstracta base con solo métodos virtuales. Sin embargo, una vez que comienzas a crear clases derivadas, no hay razón para aplicar "virtual" en todo: algunos métodos no necesitan ser extensibles.
Convertir todo en virtual significa que en cualquier punto de código, sin importar el método que se llame, nunca se puede estar seguro de que la clase hará lo que se desea, porque alguien podría haber anulado su método, rompiéndolo en el proceso (De acuerdo con la Ley de Murphy, sucederá). Esto hará que su código no sea confiable y difícil de mantener. Otra cosa muy interesante es la forma en que se llaman los métodos virtuales en los constructores. Básicamente, siguiendo este consejo sacrifica la legibilidad/confiabilidad del código a cambio de no hacer un error tipográfico bastante raro. En mi opinión, no vale la pena.
En comparación, el método no virtual garantiza que pase lo que pase, en este punto del código, el código siempre funcionará como espera (sin contar los errores que aún no ha descubierto). Es decir. alguien más no reemplazará su método con alternativas rotas.
El consejo me recuerda un error común que algunos programadores novatos tienden a hacer: en lugar de desarrollar una solución sencilla que va a arreglar el problema, se distraen y tratar de hacer que el código universal y extensible. Como resultado, el proyecto tarda más en finalizar o nunca se completa, porque la solución universal para cada escenario posible requiere más esfuerzo/tiempo de desarrollo que una solución localizada que se limita solo al problema actual.
En lugar de seguir este consejo "virtual", recomendaría seguir con Murphy's Law y KISS principle. Funcionaron bien para mí. Sin embargo, no se garantiza que funcionen bien para todos los demás.
He oído esto algunas veces pero nadie ha sido capaz de convencerme de seguirlo. Me parece un poco endeble. Tiendo a estar de acuerdo con tu análisis. Por supuesto, solo será altamente subjetivo. –
¿La inclusión de la primera función virtual en una clase no complica la representación interna al forzar un vtable o algo así? Pensé que era 'Solo hazlo virtual cuando realmente tengas que hacerlo'. –
... a menos que estés diseñando un juego. – Marlon