Vinculação dinâmica (tardia) ou estática
Considerando
class Pessoa {
public mostrar() { }
}
class Aluno extends Pessoa {
public mostrar() { }
}
Quando executarmos o seguinte código
Pessoa p = new Aluno();
p.mostrar();
Qual método é chamado?
Escolha do método em tempo de execução
Maior flexibilidade e reuso de código
Desvantagens
- Menor eficiência?
- C++, 15% mais lento?
- Objective-C, depende do runtime e do compilador
- C++, 15% mais lento?
Tabelas de métodos virtuais (C++, Java)
Em tempo de compilação
Em C++, vinculação estática é o padrão
class Pessoa {
public:
void mostrar() { }
};
class Aluno: public Pessoa {
public:
void mostrar() { }
};
Pessoa *p = new Aluno;
p->mostrar();
Linguagens deixam o programador decidir a vinculação
- Estática ou dinâmica
Em C++ a vinculação é estática por padrão
Vinculação dinâmica explícita com virtual
class Pessoa {
public:
void ler() { } // estática
virtual void imprimir() { } // tardia
};
Em Java a vinculação é dinâmica por padrão
Vinculação estática explícita com final
class Aluno {
public void ler() { } // tardia
final public void imprimir() { } // estática
static public void nada() { } //método de classe
};