next up previous contents
Next: Funções virtuais puras e Up: Polimorfismo Previous: Polimorfismo   Sumário

Funções virtuais

Uma função virtual é uma função que é declarada como virtual em uma classe base e redefinida pela classe derivada. Para declarar uma função como sendo virtual, é preciso preceder sua declaração com a palavra chave virtual. A redefinição da função na classe derivada sobrepõe a definição da função na classe base. No fundo, a declaração da função virtual na classe base age como uma espécie de indicador que especifica uma linha geral de ação e estabelece uma interface de acesso. A redefinição da função virtual pela classe derivada especifica as operações realmente executadas pelo método.

Quando acessadas normalmente, funções virtuais se comportam como qualquer outro tipo de função membro da classe. Entretanto, o que torna funções virtuais importantes e capazes de suportar polimorfismo em tempode execução é o seu modo de comportamento quando acessado através de um apontador. Lembre-se que um apontador para a classe base pode ser usado para apontar para qualquer classe derivada daquela classe base. Quando um apontador base aponta para um objeto derivado que contém uma função virtual, C ++ determina qual versão daquela função chamar baseada no tipo do objeto apontado pelo apontador. Assim, quando objetos diferentes são apontados, versões diferentes da função virtual são executadas.

Considere o seguinte exemplo:

indentation

#include $<$iostream.h$>$

class base {
public:
virtual void vfunc() {
cout $\ll$ "Esta e vfunc() de base$\backslash$n";
}
};

class derived1 : public base {
public:
void vfunc() {
cout $\ll$ "Esta e vfunc() de derived1$\backslash$n";
}
};

class derived2 : public base {
public:
void vfunc() {
cout $\ll$ "Esta e vfunc() de derived2$\backslash$n";
}
};

main() {
base $\ast$p, b;
derived1 d1;
derived2 d2;

// p aponta para base
p = &b;
p$\rightarrow$vfunc();
// p aponta para derived1
p = &d1;
p$\rightarrow$vfunc();
// p aponta para derived2
p = &d2;
p$\rightarrow$vfunc();

return(0);
}
O resultado da execução deste programa é:
    Esta e vfunc() de base
    Esta e vfunc() de derived1
    Esta e vfunc() de derived2

Observe que:

A redefinição de uma função virtual por uma classe derivada é similar a sobrecarga de funções. Entretanto, este termo não é aplicado para a redefinição de funções virtuais porque há diversas diferenças. Talvez a mais importante é que o protótipo para uma função virtual deve combinar exatamente o protótipo especificado para a classe base. Caso o protótipo seja diferente, o comportamento será exatamente o mesmo de uma função sobrecarregada -- o comportamento virtual da função será perdido. Outra restrição importante é que funções virtuais devem ser membros da classe das quais elas fazem parte -- não podem simplesmente ser funções amigas. Por estes motivos, a redefinição de funções virtuais por classes derivadas é usualmente chamada de sobreposição, e não de sobrecarga.

Deve-se observar que a ``virtualidade'' é hereditária. Isto é, quando uma função virtual é herdada, sua natureza virtual também é herdada -- mesmo quando a palavra chave virtual não é explicitamente declarada no método da classe derivada. Assim, o caráter virtual da função é mantido, não importa qual o número de níveis na hierarquia de classes.

O uso da palavra chave virtual indica que a função pode ser sobreposta, mas não obriga a sobreposição. Caso a classe derivada não sobreponha uma função virtual, então o método correspondente da classe base será utilizado.


next up previous contents
Next: Funções virtuais puras e Up: Polimorfismo Previous: Polimorfismo   Sumário
Ivan Luiz Marques Ricarte 2001-06-01