Se il distruttore non è virtuale fare una delete di un oggetto della classe derivata tramite un puntatore a classe base è undefined behavior (tipicamente quello che succederà sarà che non viene eseguito il distruttore "vero" dell'oggetto eliminato più tutti quelli delle classi base, ma solo quello della classe base, oltre ad esserci potenziale per casini con l'allocatore di memoria). Di conseguenza, la maggior parte dei compilatori appena vedono che hai una classe con un metodo virtuale (=probabilmente la vuoi usare in maniera polimorfica) ma non un distruttore virtuale ti avvisano, visto che al 90% stai sbagliando.