No, todos los destructor son por defecto NO virtuales.
Usted tendrá que definir un destructor virtual en todas las clases base
Además de eso.
Para citar Scott Meyers en su libro "A partir del C++":
The C++ language standard is unusually clear on this topic. When you try to delete a derived class object through a base class pointer and the base class has a non-virtual destructor (as EnemyTarget does), the results are undefined
En la práctica, por lo general es una buena idea para definir una clase con un destructor virtual si usted piensa que alguien podría, finalmente, crear una clase derivada de eso. Tiendo a hacer que todas las clases tengan virtual destructor de todos modos. Sí, hay un costo asociado con eso, pero el costo de no hacerlo virtual más a menudo no supera un mísero bit de sobrecarga de tiempo de ejecución.
Sugiero que solo lo haga no virtual cuando esté absolutamente seguro de que lo desea de esa manera en lugar de confiar en el no virtual predeterminado que los compiladores aplican. Puede estar en desacuerdo, sin embargo (en resumen) Recientemente tuve una horrible pérdida de memoria en algún código heredado donde todo lo que hice fue agregar un std :: vector en una de las clases que había existido durante varios años. Resulta que una de sus clases base no tenía un destructor definido (¡el destructor predeterminado está vacío, no es virtual!) Y no se estaba asignando memoria así antes de que no se filtrara memoria hasta ese punto. Muchos días de investigación y tiempo perdido más tarde ...
por cierto, solo me pregunto, ¿qué es un destrutor predeterminado? ¿Hay más de un tipo de destructor? – user88637
@ yossi1981: si no declaras un destructor en una clase, el compilador lo inserta. A riesgo de equivocarse con respecto a un caso inusual, este "destructor predeterminado" es el mismo que si hubiera definido "~ MyClass() {}". –
@onebyone: para ser precisos: 'public: ~ MyClass() {}' - aunque los miembros de la clase son por defecto privados. – MSalters