Ajuda com herança e polimorfismo

Pessoal, estou pondo em prática alguns exercicios da caelum(fj-11), porém, também crio os meus próprios exercicios, com outros assuntos.
A descrição é a seguinte:
Estou criando Funcionarios, que extendem a classe Pessoa, para a seguir criar a classe Empresa com uma List de funcionarios.
Minha classe Pessoa possui apenas String nome e int idade, e a classe Funcionarios possui uma String cargo.

Porém ao tentar declarar com polimorfismo, eu acabo por não conseguir setar o cargo, acho que devo ter exagerado no encapsulamento,
Segue o código:

package com.caelum.testeListaObjetos;

public class Pessoa {

	private String nome;
	private int idade;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

}
package com.caelum.testeListaObjetos;

public class Funcionario extends Pessoa {

	private String cargo;
	
	public void setCargo(String cargo){
		this.cargo = cargo;
	}
	
	public String getCargo(){
		return cargo;
	}
	
	
}
package com.caelum.testeListaObjetos;

public class Testar {

	public static void main(String[] args) {
		
		Pessoa p1 = new Funcionario();
		p1.setNome("João");
		p1.setIdade(25);
		p1.setCargo("Diretor"); // Aqui eu não consigo setá-lo
		
		
	}
	
}

Alguém poderia abrir meus olhos para onde estou errando?
Desde já obrigado

“Exagerar” no encapsulamento foi engraçado hehehee

acontece que você está com o tipo mais genérico.

Pessoa é mais genérico do que Funcionário, certo?
Quando você dizPessoa p = new Funcionario();

a JVM sabe que você tem uma instância de pessoa, não funcionário.
Portanto você só tem acesso aos métodos e atributos de Pessoa.

para ter acesso aos métodos de funcionário você pode ou instanciar um funcionário diretamente, ou dar um cast.

Pessoa p = new Funcionario(); Funcionario f = (Funcionario) p; // agora tem acesso aos métodos de Funcionario Funcionario func = new Funcionario(); // assim também

EDIT:
Porém se você tivesse algum método sobreescrito, seria diferente.

Ex:

[code]class Pessoa{

public void imprime(){
    System.out.println("Sou uma pessoa");
}

}

class Funcionario extends Pessoa{

@Override
public void imprime(){
    System.out.println("Sou um funcionário");
}

}

class Teste{

public static void main(String[] args){
    Pessoa p = new Funcionario();
    p.imprime(); // Será invocado o método de Funcionário
}

}[/code]

digaoneves,

Ahh sim, a minha dúvida foi sanada justamente no seu edit uahueha
Porque eu já possuia um exemplo com a sobrescrita, e estava tentando fazer o mesmo no exemplo aqui do tópico.
Muito obrigado pela resposta
abraço