Ma tu dichiari:

codice:
Alfa a = b;
a è un oggetto che ha memoria propria, se gli viene assegnato il valore di b rimane sempre un oggetto di tipo Alfa, così quando provi ad effettuare il downcasting non ha effetto perché effettivamente è un oggetto di tipo Alfa, non di tipo Beta (e quindi anche di tipo Alfa per ereditarietà).
Cambia tutto se a non ha memoria propria:

codice:
Alfa& a=b;
A questo punto a sta nella stessa locazione di memoria di b, e il downcasting è valido perché a riferisce un oggetto di tipo Alfa e Beta.

Edit: Però rimane il problema che std::list fa una copia degli oggetti che vengono inseriti nella lista, per cui mi devo correggere: il mio metodo non può funzionare.