O que é uma função virtual?
Uma função virtual é uma função, definida em uma superclasse, que deve estar presente em uma subclasse para que essa subclasse tenha uma definição de classe completa. As funções virtuais dependem de um paradigma de programação orientado a objetos chamado herança virtual, que é mais comum em C ++ usando a palavra-chave "virtual". Para definir uma função virtual, são necessárias duas classes, uma superclasse e uma subclasse. A superclasse é o local onde a função é declarada primeiro e possivelmente definida. A subclasse é onde a função é definida - ou substituída, dependendo se a função foi definida na superclasse.
A função virtual pode ser definida de uma de duas maneiras. Primeiro, ele pode ser definido como um esboço, no qual possui um corpo vazio e não faz nada. Segundo, poderia ser definido como uma função virtual pura, onde é definido como NULL no arquivo de cabeçalho da superclasse.
Existem vantagens e desvantagens de ambas as metodologias. Definir uma função como um stub garante que todas as subclasses tenham alguma implementação, mesmo que não faça nada. Se alguém esquecer de substituir a função e implementá-la adequadamente em uma subclasse, no entanto, nenhum erro ou aviso aparecerá para apontar isso. A definição de uma função virtual pura, por outro lado, exige que cada subclasse tenha sua própria definição da função e os erros aparecerão se esse não for o caso.
As funções virtuais, no entanto, estão sujeitas às mesmas regras de herança que as funções não virtuais; portanto, as hierarquias de herança com mais de dois níveis podem não exigir definições explícitas de funções virtuais. Por exemplo, pode-se considerar uma classe A que declara uma função virtual, implementada na subclasse B. A classe B possui uma subclasse própria, a classe C. A classe C não requer uma definição explícita da função da classe A, porque ela herda a definição da classe B. Se necessário, a classe C pode substituir a função da classe B ou pode substituir a função da classe B enquanto também a chama.
No outro extremo, as funções virtuais não precisam ser definidas em uma subclasse se forem declaradas virtuais nessa subclasse. Por exemplo, pode-se considerar uma classe A que declara uma função virtual e possui duas subclasses, B e C. Além disso, pode-se imaginar que a classe B possui subclasses D e E, e a subclasse C possui subclasses F e G.
Todas as classes B a G devem ter a função virtual da classe A definida de alguma forma. Se a classe B possui uma implementação da função de A, as classes D e E não precisam ser refeitas. Talvez as subclasses de C precisem implementar a função de A, mas ambas fazem algo diferente, portanto, definir a função na própria classe C não seria útil. Nesse caso, a função pode ser declarada virtual na classe C e uma implementação não é necessária.
As funções virtuais podem ser assustadoras de aprender, mas, quando usadas corretamente, podem reduzir a duplicação de código e facilitar a compreensão do código em geral. No entanto, existem muitas armadilhas com funções virtuais, principalmente em relação à herança múltipla. Na herança múltipla, é possível que funções virtuais definidas de forma ambígua entrem em conflito entre si, portanto, elas devem ser usadas com cautela nesse contexto.