Função virtual

Origem: Wikipédia, a enciclopédia livre.

Na programação orientada a objetos uma função virtual ou método virtual é uma função ou método cujo comportamento pode ser sobrescrito em uma classe herdeira por uma função com a mesma assinatura. Esse conceito é uma parte muito importante do polimorfismo em programação orientada a objetos (OOP).

Propósito[editar | editar código-fonte]

O conceito de funções virtuais resolve os seguintes problemas:

Em OOP quando uma classe derivada herda uma classe base, um objeto da classe derivada pode ser referenciado como sendo do tipo da classe base ou do tipo da classe derivada. Se houver métodos da classe base sendo sobrescritos pela classe derivada, o comportamento da chamada do método pode ser ambíguo.

A distinção entre virtual e não-virtual resolve esta ambiguidade. Se uma função em questão é declarada "virtual" na classe base então a função da classe derivada será chamada (se existir). Se não for virtual, a função da classe base será chamada.

Funções virtuais superam os problemas com a solução "tipo de campo" ao permitir que programador declare funções na classe base que possam ser redefinidas em cada classe derivada.

Em C++ funções virtuais ou métodos virtuais são declaradas acrescentando-se a palavra-chave virtual na declaração da função.

Classes abstratas e métodos virtuais puros[editar | editar código-fonte]

Uma função virtual pura ou método virtual puro é uma função virtual que deve ser implementada por uma classe derivada, se essa classe não for abstrata. Classes contendo métodos virtuais puros são chamados "abstratos"; elas não podem ser instanciados diretamente, e uma subclasse abstrata só pode ser instanciada diretamente se todos os métodos virtuais puros forem implementados por essa classe ou uma classe pai. Tipicamente, métodos virtuais puros tem uma declaração (assinatura) e nenhuma definição (implementação).

Por exemplo, a classe base abstrata "MathSymbol" pode prover uma função virtual pura doOperation(), e classes derivadas "Plus" e "Minus" implementando doOperation() para prover implementações concretas. Implementar doOperation() pode parecer não fazer sentido na classe "MathSymbol" visto que "MathSymbol é um conceito abstrato cujo comportamento é definido individualmente para cada tipo específico (subclasse) de "MathSymbol". Similarmente, uma certa subclasse de "MathSymbol" não estaria completa sem uma implementação de doOperation().

Apesar dos métodos puramente virtuais tipicamente não possuírem implementação na classe que as declara, métodos virtuais puros em C++ podem conter uma implementação na declaração de sua classe, provendo um comportamento reserva ou padrão ao qual uma classe derivada pode delegar, se apropriado.

Funções virtuais puras também são usadas onde as declarações de métodos servem para definir uma interface para a qual as classes derivadas suprirão todas as implementações. Uma classe abstrata trabalhando como interface contém apenas funções virtuais puras, e nenhum membro ou métodos ordinários. Uso de classes puramente abstratas como interfaces funciona em C++ como suporte a herança múltipla. Como muitas linguagens OO não suportam herança múltipla, elas normalmente proveem um mecanismo de interface separado. Isto é visto em Java por exemplo.

Ver também[editar | editar código-fonte]