Ciao!
Prima di tutto, in questo caso si parla di override e non overload
Detto questo, una cosa importante va messa subito in chiaro: quello che tu dici/chiedi vale solo se stiamo trattando referenze/puntatori alla gerarchia. Quello che voglio dire è che se fai:
viene chiamato il metodo della classe donna, virtuale o no che sia.
Se invece hai un puntatore alla classe base:
(gli accenti nel codice sorgente non si potrebbero mettere, ma considera anche il mio come più-o-meno-pseudocodice

)
allora sì che il virtual entra in gioco. Se infatti il metodo non è dichiarato virtuale, verrà chiamato quello della classe entita. Se il metodo è virtuale invece la "virtualità" viene propagata implicitamente alle sue ridefinizioni nelle classi derivate. Quindi anche se corri () non fosse virtual in umano (essendo però virtual in entità) il metodo della classe donna verrebbe chiamato.
Detto questo, il mio consiglio è di dichiarare virtual anche i metodi delle classi derivate, sia perché alcuni compilatori (google tells me) si lamentano con dei warning se non lo fai sia (soprattutto) per chiarezza del codice
