Aula Prática – Linguagens de Programação Classes abstratas Considere uma empresa que possui um cadastro de todos seus funcionários. Crie uma classe abstrata que represente um funcionário, defina um construtor e um método abstrato chamado calcula salário, um método para imprimir o código funcional (que não pode ser sobreposto) e um método que imprime as informações básicas do funcionário. Os atributos dessa classe, que devem ser privados, são: nome, código funcional e cidade de nascimento. Crie três classes concretas que herdam da classe funcionário, que são: funcionário básico (ganha um salário fixo), funcionário comissionado (ganha comissão por trabalho feito) e funcionário horista (ganha por hora trabalhada). As três classes possuem um construtor, sendo que no momento em que um funcionário é cadastrado no sistema, é definido seu salário básico, comissão ou pagamento por hora. As classes para os funcionários horistas e comissionados devem possuir métodos para definir a quantidade de horas trabalhadas e a quantidade de trabalho feito, respectivamente. Crie uma classe chamada relatório, que imprime um relatório de todos os funcionários, relatando suas informações básicas e seu salário. Na classe principal, usando polimorfismo, crie um vetor com cinco funcionários, preencha com cinco funcionários de diferentes tipos e imprima os dados de cada funcionário e seu salário. Para executar os métodos para a definição de horas trabalhadas e trabalho feito, use o recurso de downcasting, exemplificado abaixo. Exemplo de downcasting Funcionario func = new Funcionario(); Horista hora = (Horista) func;