Oii, Jonas!
Parabéns por concluir o desafio e por aplicar conceitos tão fundamentais de Orientação a Objetos no C#.
Sua solução foi além do proposto ao utilizar uma classe abstrata. Essa é uma decisão excelente, pois, ao definir Funcionario como abstract, você garante que ninguém consiga instanciar um funcionário "genérico", obrigando a criação de tipos específicos como Gerente ou Desenvolvedor. O uso do override nas subclasses mostra que você compreendeu bem como o polimorfismo permite que cada objeto responda de maneira particular a uma mesma chamada de método.
Pra complementar seus estudos sobre como o C# gerencia esses comportamentos, recomendo a leitura da documentação sobre Classes e Membros Abstratos.
Você percebeu como transformar a classe em abstrata ajuda a evitar que o sistema crie objetos que não teriam um comportamento completo na vida real?
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!