É uma dúvida simples, apenas para confirmar o entendimento. Envolve mais a questão de construtores do que polimorfismo.
O cálculo feito pelo programa do professor (com o erro de referencia f ao inves de ev) foi 5475.
ControleBonificacao controle = new ControleBonificacao();
controle.registra(g1); // aqui somou 5250. tudo certo
controle.registra(f); // aqui somou 125 que é 5% de 2500, pois foi setado f.salario novamente, agora em 2500 ao inves de manter 2000 e setar 2500 pro ev.salario
controle.registra(ev); // aqui somou apenas o +100 que é o bonus fixo, pois a variavel salario do ev estava setada em 0 pelo construtor e ele fez o cálculo da bonificacao de funcionario 0,05*0(salario zerado setado pelo construtor)=0.
Por isso o resultado foi 5250+125+100=5475.
O programa fez o calculo porque o construtor iniciou a variável ev.salario, mas iniciou com 0.