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