1) l'overriding è l'overloading di una funzione membro virtuale. Ha lo scopo di controllare che pur overloadando una funzione membro in una classe derivata, tu conservi cmq l'interfaccia della classe base, perciò ad esempio non puoi cambiare il valore di ritorno.

2) se dichiari virtuale una funzione membro nella classe base, questa sarà automaticamente virtuale in tutte le classi derivate (puoi ridichiararlo nelle classi derivate, ma è superfluo).