Oie Michael, tudo bem contigo?
Não existe necessariamente uma vantagem de usar uma ou outra, mas existem diferenças entre os dois e caberá ao programador usar aquele que tiver como preferência, ou dependendo da situação, aquele que deve ser usado.
Ao fazermos:
Funcionario gerente = new Gerente();
Nós só conseguiremos usar os métodos da classe "Funcionario", aqueles especificamente criados na classe "Gerente" ficam inacessíveis nessa situação, a não ser que esteja sendo feito uma sobrescrita.
Agora quando fazemos:
Gerente gerente = new Gerente();
Temos acesso a todos os métodos, tanto aqueles herdados da classe "Funcionario" como aqueles criados especificamente na classe "Gerente".
Quando fazemos do primeiro jeito, geralmente só queremos mexer nos métodos herdados da classe "Funcionário", então limitamos o escopo para só termos acesso a eles, mas também daria para acessá-los do segundo jeito, então em uma situação onde queremos mexer nos métodos da superclasse, tanto faz qual opção é escolhida.
Agora se queremos acessar os métodos específicos criados na classe "Gerente", devemos obrigatoriamente usar a segunda opção, pois usando a primeira não teremos acesso a esses métodos.
Ficou um pouco mais claro agora?
Se tiver qualquer outra dúvida estarei por aqui :)