No, perchè base::funzione() non è dichiarato virtual.

Se il metodo nella base è dichiarato virtual allora viene cercato il metodo con lo stesso nome più in giù nella gerarchia (il primo che non è dichiarato virtual), altrimenti, viene eseguito proprio il metodo chiamato.

Dichiaralo come
codice:
virtual void funzione()
e andrà ad eseguire quello della classe derivata.