Linguagem de
Programação II
Carlos Oberdan Rolim
Ciência da Computação
Sistemas de Informação
Métodos virtuais
e
Classes abstratas
Tipos de polimorfismo
Polimorfismo estático
Sobrecarga de métodos
Polimorfismo dinâmico
Métodos virtuais
Métodos virtuais
É possível acessar objetos de classes diferentes
utilizando-se um mesmo comando, por meio de
métodos virtuais.
Constitui outra forma de polimorfismo
Na utilização de métodos virtuais um programa que
aparenta estar chamando um método de sua classe
pode, na verdade, estar chamando um método de outra
classe
Métodos virtuais
Exemplo das figuras geométricas onde armazena-se objetos
em um array
Cada objeto possui um método desenhar
Apontar ponteiros para esses objetos e então consegue-se
invocar métodos diferentes
Código abaixo demonstra a existencia do polimorfismo pois
dependendo do tipo de objeto apontado será desenhada
determinada figura geométrica
FormasGeo * ptr[20];
int k;
for (k = 0;k < n; k++)
ptr[k]->desenhar();
Métodos virtuais
No exemplo anterior todos os objetos pertencem a classe
base FormasGeo
É necessário que o método comum, no caso desenhar(),
seja declarado como virtual na classe-base FormasGeo
O que torna uma função virtual especial é que, quando
uma é acessada usando-se um ponteiro da classe base
para um objeto da classe derivada, o C++ determina qual
função chamar no momento da execução, baseando-se
no tipo de objeto para o qual se aponta.
Assim, quando objetos diferentes são apontados,
diferentes versões são executadas.
class FormasGeo {
public:
void desenhar();
}
class quadrado :public FormasGeo {
public:
void desenhar();
};
class retangulo :public FormasGeo {
public:
void desenhar();
};
int main ( ){
quadrado quadrado1;
retangulo retangulo1;
quadrado1.desenhar();
retangulo1.desenhar();
}
Exemplo básico usando objeto.método
class FormasGeo {
public:
virtual void desenhar();
};
int main ( ){
quadrado quadrado1;
retangulo retangulo1;
class quadrado :public FormasGeo {
public:
void desenhar();
};
FormasGeo * ptr;
ptr = &quadrado1;
ptr->desenhar();
class retangulo :public FormasGeo {
public:
void desenhar();
};
ptr = &retangulo1;
ptr->desenhar();
}
Saída:
Método desenhar classe-quadrado
Método desenhar classe-retangulo
Exemplo básico usando um ponteiro para a classe base
com utilização de métodos virtuais
Métodos virtuais e classes abstratas
São classes que não podem ter objetos instanciados
Uma classe é dita abstrata quando possui pelo menos um
método abstrato (virtual puro)
Uma vez declarado um método virtual puro em uma classe-base , este
deverá ser redefinido nas classes derivadas em que se deseja criar um
objeto.
Se qualquer das classes derivadas não redefinir o método virtual puro
da classe-base, a classe derivada tornar-se-a uma classe abstrata
Um método abstrato é aquele que não é implementado na
classe
Usamos “= 0” após o protótipo do método para torná-lo
abstrato (método virtual puro)
Exemplo: virtual int area() = 0;
class FormasGeo {
public:
virtual void desenhar() = 0;
};
Método virtual puro torna a classe
abstrata
class quadrado :public FormasGeo {
public:
void desenhar();
};
class retangulo :public FormasGeo {
public:
void desenhar_2();
};
Redefinição do método
Não redefiniu o método desenhar
int main ( ){
quadrado quadrado1;
// retangulo retangulo1;
}
Gera um erro pois classe retangulo
se tornou abstrata
Download

public FormasGeo