Hay diferentes temas con lo que se propone, la primera de las cuales ya están contempladas en otras respuestas: sólo es necesario destructores virtuales si la intención de eliminar a través de un puntero a una base (una recomendación general es proporcionar ya sea un público destructor virtual o un destructor no virtual protegido ya que eso inhibiría la eliminación a través de la clase base).
Hay otro problema en que cuando un compilador ve una definición de clase, posiblemente no pueda saber si se derivará o no. Considere si implementa una clase base en una unidad de traducción. En un momento posterior, deriva de la clase. Si esa derivación implicaría hacer que el constructor sea virtual, la traducción de la clase base tendría que recompilarse, o bien la ODR (Regla de una sola definición) se rompería en su programa.
Si agrega otras unidades de traducción a la mezcla, las cosas empeoran.Siempre que incluya un archivo de encabezado de una unidad de traducción, se le forzará también a manualmente incluir al menos un encabezado donde se define un objeto derivado de esa clase (aumentar el acoplamiento), o bien, de nuevo, el compilador generaría una definición diferente para esa clase única en esa unidad de traducción (en comparación con la unidad de traducción donde se define la clase derivada) rompiendo nuevamente la ODR.
El problema es que el compilador solo tiene una vista parcial de su proyecto, y realmente no puede inferir lo que necesita/quiere de lo que ve.
Sutter escribió sobre eso en [Virtuality] (http://www.gotw.ca/publications/mill18.htm). –
que fue una lectura increíble! gracias –