Quando uma classe deriva de outra, ela herda todos os membros, até aqueles marcados com private na classe base e que, portanto, não são diretamente acessíveis na classe derivada.
Vamos pensar em uma situação mais simples:
class Funcionario
{
private string _cpf;
public void DefinirCPF(string novoCPF)
{
_cpf = novoCPF;
}
}
Aqui, a classe Funcionario define o membro privado _cpf e, só pra reforçar, sabemos que o código abaixo não compila:
Funcionario func = new Funcionario();
func._cpf = "342.545.235-39";
Porque _cpf é acessível somente dentro da classe Funcionario. Mas, esta classe possui o método DefinirCPF que é público e, portanto, acessível fora da classe Funcionario.
Agora, vamos usar um caso de herança:
class Diretor : Funcionario
{
}
A classe Diretor possui o membro _cpf também! Mas, este é inacessível, então o código com construtor abaixo não compila:
class Diretor : Funcionario
{
public Diretor()
{
_cpf = "342.545.235-39";
}
}
Contudo, a classe Diretor também possui o método público DefinirCPF. Então realizar uma chamada a este método é permitido:
class Diretor : Funcionario
{
public Diretor()
{
DefinirCPF("342.545.235-39");
}
}
A implementação de DefinirCPF foi definida na classe base Funcionario. Do ponto de vista do Diretor, a implementação na classe base não importa. O importante é que este é um método público que pode ser invocado. Assim como no exemplo abaixo:
static void Main(string[] args)
{
Funcionario func = new Funcionario();
func.DefinirCPF("342.545.235-39");
}
A implementação em DefinirCPF é omitida do método Main e a classe Program não precisa ter acesso aos membros que este método usa, pois isto é responsabilidade de Funcionario.
Aqui, acontece a mesma coisa:
public Diretor()
{
DefinirCPF("342.545.235-39");
}
Beleza? O que você acha disto até agora?
Agora, vamos remover o método DefinirCPF da classe Funcionario e colocar este código dentro do construtor:
class Funcionario
{
private string _cpf;
public Funcionario(string cpf)
{
_cpf = cpf;
}
}
Agora, só podemos criar uma instância de Funcionario preenchendo este argumento e as classes derivadas precisam preencher este argumento também, através da palavra reservada base no construtor:
class Diretor : Funcionario
{
public Diretor() : base("342.545.235-39")
{
}
}
E aqui, novamente, não escrevemos nenhum código na classe Diretor que acessa o campo privado _cpf e define a ele um valor. Quem faz isto é o construtor definido em Funcionario.
As regras que vimos acima com chamadas de métodos valem aqui também! A implementação deste construtor é omitida a classe derivada Diretor, somente a classe Funcionario a conhece e, portanto, pode acessar seus membros privados.
O que você acha? Se você continuar com dúvida, poderia dar um exemplo de código e pontuar as linhas que te trazem dúvidas sobre o comportamento ou o que não deveria compilar?
Ficamos no aguardo. Abs.