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 essa subclasse ter uma definição completa de classe. As funções virtuais dependem de um paradigma de programação orientado a objetos chamado herança virtual, que é mais comumente vista em C ++ usando a palavra-chave "virtual". Para definir uma função virtual, duas classes são necessárias, uma superclasse e uma subclasse. A superclasse é onde a função é declarada pela primeira vez 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 duas maneiras. Primeiro, pode ser definido como um stub, no qual tem um corpo vazio e não faz nada. Segundo, pode ser definido como uma função virtual pura, onde é definido como nulo no arquivo de cabeçalho da superclasse.
Existem vantagens e desvantagens para ambas as metodologias. Definir uma função como um stub garante que todas as subclasses haVeja alguma implementação, mesmo que não faça nada. Se alguém esquecer de substituir a função e implementá -la corretamente em uma subclasse, no entanto, nenhum erro ou aviso parecerá apontar isso. Definir 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, que é implementada na subclasse B. A classe B tem uma subclasse própria, a classe C classe C não requer uma definição explícita da função da classe A, porque 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 e também chamá -la.
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 tem subclasses F e G.
Classes B a G Tudo deve ter a função virtual da Classe A definida de alguma forma. Se a Classe B tiver uma implementação da função de A, as classes d e e não precisam que ela seja removida. Talvez as subclasses de C precisem implementar a função de A, mas ambos 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.
Funções virtuais podem ser assustadoras para aprender, mas quando usadas corretamente, elas podem reduzir a duplicação de código e facilitar o códigoem geral. Existem muitas armadilhas com funções virtuais, no entanto, especialmente em relação à herança múltipla. Em herança múltipla, é possível que funções virtuais definidas ambiguamente entrem entre si, para que elas sejam usadas com cautela nesse contexto.