Please enable JavaScript.
Coggle requires JavaScript to display documents.
Polimorfismo - Coggle Diagram
Polimorfismo
virtual
-
Apesar de não necessariamente precisar ser redefinido na classe derivada, a boa prática define a sua modificação para abranger as funcionalidades especiais da classe derivada.
A redefinição deve ter a mesma assinatura e o mesmo tipo de retorno da função virtual da base, ela também vai ser automaticamente virutal.
-
Problema: como acessar as funcionalidades de uma classe derivada através de um ponteiro ou referência para a classe base?
Tradicionalmente, adicionamos um TIPO para tanto a classe base como para as classes derivadas, ele vai armazenar o tipo da classe atual -> Desvantagem: adicionar classes derivadas depois significa modificar a classe base.
-
Virtual Method Tables
-
Dynamic Binding
Se um método virtual é chamado por ponteiro ou referência, a função é desconhecida na hora da compilação.
Apoiado por Virtual Method Tables, ou seja, uma VMT, que é criada para cada classe com pelo menos um método virtual (Um array de endereços dos métodos virtuais da classe)
Cada objeto de uma clase polimórfica possui um ponteiro VMT (Um ponteiro para o VMT da classe adequada)
A função é executada com o ponteiro do VMT do objeto referenciado sendo lido e com o endereço do método virtual sendo lido no VMT.
Desvantagem: a VMT ocupa memória e o tempo de resposta pode ser afetado pelo endereçamento indireto de métodos.
É preciso cuidado quando chamamos um destrutor para objetos de classes derivadas quando estamos acessando-o por um ponteiro/referência à classe base.
Ao só deletar o ponteiro/o que ele referencia, o programa só chama o destrutor da classe base e não libera a memória ocupada por membros exclusivos da classe derivada.
Declarar um destrutor como virtual significa que a versão apropriada do destrutor vai ser executada (classe base, derivada, os dois etc.). Uma classe base sempre deve ter um destrutor virtual.