Olá Ley, tudo bem?
Se o código é protected é porque ele realmente não deve ser usado em um contexto fora da própria classe e as classes filhas. Classes externas só poderão utilizar esses códigos apenas por meios indiretos. Que é o que ocorre com o método GetBonificacao() neste exemplo:
public Estagiario(double salario, string cpf)
:base(salario, cpf)
{
GetBonificacao();
}
public override void AumentarSalario()
{
// Qualquer código
}
protected override double GetBonificacao()
{
return Salario = Salario + Salario * .1;
}
Estes códigos dentro da classe Estagiario funcionam bem. E ao criar o objeto do tipo Estagiario em Program.cs, o GetBonificacao() também é executado, porque esse método foi chamado dentro da classe que ele pode ser usado. Mas não é possível utilizar o GetBonificacao() fora da classe Estagiário, porém, podemos executar esse código com uma gambiarra (que não é aconselhavel, porque se o método é protegido, deve ter um bom motivo para isso) dentro da classe Estagiário:
public double Bonificar()
{
return GetBonificacao();
}
Com este código acima, é possível bonificar o Estagiario, mesmo que esse método seja protegido, mas como disse, não é recomendado fazer isso.
Sugiro que faça testes com métodos protegido para ver até onde vai a limitação deles e o que pode fazer em relação às restrições deles.
Espero ter ajudado!