Basta mettere virtuale il distruttore della classe base per accontentare il compilatore.
Nel caso specifico in esame il distruttore non deve effettuare un cleanup di risorse e nelle classi derivate può essere omesso.
Però se una classe derivata fosse costituita così (ad esempio):
codice:
//Eccezioni di dizionario vuoto
class EmptyError : public Dizionario_Exception
{
public:
       EmptyError() { dato_privato = new char[MAXLEN]; } 	   
       ~EmptyError() { delete[] dato_privato; }
       virtual void debug_print() const
	   {
            std::cerr << "Dizionario vuoto."<<std::endl;
       }
private:
     char* dato_privato.
};
Allora è imperativo che sia virtuale il distruttore della classe base o la memoria rimane allocata.
Per evitare problemi futuri meglio mettere sempre i distruttori virtuali.
E ricorda che il polimorfismo non funziona solo con i puntatori, ma anche con i reference.