Recentemente encontrei um problema de Memory Leak em uma aplicação, devido a causa do problema estou fazendo este post para evitar esse tipo de erro.

 

No Delphi a diretiva virtual permite que seu método seja sobrescrito com o mesmo nome, ou seja, em uma subclasse você pode reescrever um método de acordo com suas necessidades.

 

Ja a diretiva override significa que o método esta sobrescrevendo o método original, então na frase acima o método sobrescrito deve conter a diretiva override , e o método original a diretiva virtual .

 

Um erro simples de esquecer uma dessas diretivas pode acontece de ao dar .Free em uma classe não chamar o destructor , ocasionando na não liberação de memória de alguns objetos.

 

Exemplo:

 

1. Abaixo temos a classe TRetornoWebService , nessa classe declaramos que o Create pode ser sobrescrito por uma subclasse, e o Destroy está sendo reescrito, pois, a classe TObject do delphi já possui um virtual em seu Destroy .

 

1.

 

2. Agora na subclasse TRetornoConsultaNFe , que é “filha” da TRetornoWebService , sobreescrevemos o Create e o Destroy das classes ancestrais, nesse caso não foi necessário adicionar o virtual no Destroy da TRetornoWebService, pois, a TObject já possuí um Destroy declarado com virtual.

 

2.

 

2. Na imagem acima o inherited chama o método original da classe pai após realizar as chamadas acima dele.

 

 

Algumas outras diretivas:

 

virtual - Usado para definir um método que pode ser sobrescrito.

override - Utilizado para definir um método que está sobrescrevendo um método virtual.

abstract - É usado com virtual ou override para definir um método sem implementação que deve ser sobrescrito na subclasse, senão o mesmo não será chamado.

final - Usado com virtual ou override para definir um método que não pode ser sobrescrito.

reintroduce - É como o override, porem, funciona com métodos não dinamicos e não virtuais. Utilizado se você quiser reintroduzir um método  e comunicar para o compilador que você não cometeu um engano escrevendo um método com mesmo nome da classe pai.

overload - Essa diretiva permite que você declare um método com mesmo nome, porem, com parâmetros diferentes.