Upload
duonghuong
View
217
Download
0
Embed Size (px)
Citation preview
Programação Orientada a Objetos
Renato Dourado MaiaUniversidade Estadual de Montes Claros
Engenharia de Sistemas
HERANÇA E COMPOSIÇÃO
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 2/28
Unidade IV
• Unidade IV – Herança e Composição:– Herança simples.– Composição.– Combinando composição e herança.– Herança múltipla.– Polimorfismo e funções virtuais.– Classes abstratas.
• Já trabalhamos os tópicos Herança Simples, Composi-ção e Combinando composição e herança.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 3/28
Unidade IV
• O tópico Herança múltipla deverá ser estudado por meio da leitura do livro.
• Hoje veremos o tópico Polimorfismo e funções virtu-ais.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 4/28
Polimorfismo e Funções Virtuais
• Como já foi visto, quando se trabalha com herança pública, pode-se realizar “upcasting” (“cast” para a classe pai) quando necessário.
• A classe derivada é um tipo da classe base e pode substituí-la quando necessário:
void f(Animal &an) { an.come() ;an.dorme();
};void g(Ave &av) { f(av); }
Animal
come()dorme()
Ave
botaOvo()voa()
Mamifero
mama()
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 5/28
Polimorfismo e Funções Virtuais
• Um “upcast” também pode ser efetuado em pon-teiros ou referências, sem a necessidade de um cast explícito.
• Obviamente, an1 e an2 poderão ser utilizados ape-nas como Animais e não como Aves.
Ave av; Animal * an1 = & av;
Animal & an2 = av;
an1-> come();an1->dorme();// an1->botaOvo(); // ERRO!!!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 6/28
Polimorfismo e Funções Virtuais
• Problema:– E se um método de Animal, por exemplo, Animal::come,
fosse sobrescrito na classe Ave?class Ave: public Animal {public: void come( ); void voa( ); void botaOvo( );}...Ave av;Animal * an = &av;an-> dorme (); // Animal::dorme()an-> come (); // Animal::come()!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 7/28
Polimorfismo e Funções Virtuais
• A solução para o problema virá com a utilização de funções virtuais, implementando o Polimorfismo!– O Polimorfismo é o terceiro conceito fundamental da pro-
gramação orientada a objetos (os outros são o Encapsula-mento e a Herança).
– O Polimorfismo provê outra dimensão de separação entre interface e implementação, desacoplando “o quê” de “co-mo”, melhorando a organização do código gerado e o seu entendimento.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 8/28
Polimorfismo e Funções Virtuais
• A solução para o problema virá com a utilização de funções virtuais, implementando o Polimorfismo!– O Polimorfismo permite também a criação de programas
extensíveis que podem ter funcionalidades adicionadas não somente durante o processo de criação do projeto, mas também quando uma nova necessidade for detecta-da.
– O Polimorfismo permitirá trabalhar com toda uma hierar-quia de classes em termos de seu tipo básico!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 9/28
Polimorfismo e Funções Virtuais
• Já foi visto que a herança permite criar classes que podem se comportar como tipos de outras classes.
• Essa possibilidade é muito interessante, pois permite que objetos de diversas classes diferentes, porém derivadas de um mesmo tipo base, possam ser tra-tadas como se elas fossem de um único tipo:– Um código estruturado dessa forma permitirá que se tra-
balhe com todas essas diferentes classes de maneira úni-ca, mas com cada classe podendo possuir uma maneira própria de tratar situações diferentes!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 10/28
Polimorfismo e Funções Virtuais
• Foi essa possibilidade que se tentou explorar no e-xemplo da hierarquia de Animal:– Uma Ave poderia ter sua própria maneira de comer, dife-
rente das dos outros Animais.– Seria interessante que essa maneira diferente de imple-
mentar o método come() fosse preservada, mesmo quan-do o que se tem é um ponteiro para Animal que aponta para um objeto do tipo Ave.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 11/28
Polimorfismo e Funções Virtuais
• Para verificar como efetuar isso, deve-se entender como a linguagem C++ efetua a ligação entre a fun-ção que está sendo chamada e o objeto “chamador” da função.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 12/28
Ligação Entre Objeto e Função
• A conexão entre uma chamada à função e o corpo da função é chamada de ligação: binding. – Quando a ligação é efetuada antes da execução do pro-
grama (efetuada pelo compilador e pelo linker) ela é deno-minada de ligação estática (early binding):
✔ Essa é a maneira tradicional de efetuar a ligação.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 13/28
Ligação Entre Objeto e Função
• O problema da chamada ao método come() de Ave é causado pela ligação estática: o compilador não con-segue determinar a função correta a ser chamada, quando a única coisa que ele conhece é o tipo do ponteiro (Animal*) que está sendo utilizado.
• A solução para o problema é utilizar ligação dinâmi-ca (late binding), que significa que a ligação será efe-tuada em tempo de execução, baseada no tipo do objeto que está sendo apontado, e não no tipo do ponteiro.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 14/28
Funções Virtuais
• Para permitir que a ligação dinâmica (late binding) o-corra para determinada função, é necessário em C++ que a função seja declarada como virtual na classe base. No restante da hierarquia, ela será virtual.
• Além disso, é necessário que os objetos estejam sen-do manipulados por meio de ponteiros ou referên-cias para a classe base. Se não for esse o caso, o compilador executa a ligação entre o objeto e a fun-ção a ser chamada em tempo de compilação!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 15/28
Funções Virtuais
• Somente a declaração da função necessita da pala-vra chave virtual, não a definição...
• Pode-se usar a palavra chave virtual nas declarações da função nas classes derivadas, mas isso é redun-dante!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 16/28
Polimorfismo e Funções Virtuais
• Solução do problema básico:
class Animal {public: virtual void come( ); virtual void dorme( );};class Ave: public Animal {public: void come( ); void voa( ); void botaOvo( );}
void g(Animal &an) { an.come();}
int main() { Ave av; Animal an1; g(av); // OK: upcasting! g(an1); // OK! Animal * ptan = &av; // upcasting! ptan-> dorme (); // Animal::dorme() ptan-> come (); // Ave::come() return 0;}
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 17/28
Polimorfismo – Síntese
• O polimorfismo implica na existência de funções ho-mônimas para lógicas semelhantes ao longo de uma hierarquia.
• Para que haja polimorfismo, a ligação entre o objeto e a função deve ser feita em tempo de execução (li-gação dinâmica).
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 18/28
Polimorfismo – Síntese
• A implementação do polimorfismo em C++ pressu-põe a utilização de funções virtuais.
• Quando uma classe base tem funções que devem ter comportamentos diferentes para as suas derivadas, elas devem ser declaradas como virtuais na base e os seus códigos devem ser redefinidos nas deriva-das.
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 19/28
Polimorfismo – Outro Exemplo
• Considere a definição de um tipo como Shape, a ser utilizado em um sistema gráfico. O sistema deve su-portar círculos, triângulos e quadrados:
class Point { /* ... */};class Color{ /* ... */};enum Kind { circle, triangle, square };class Shape {
Kind k; Point center;Color col;
public:void draw( );void rotate(float ang);// ...
};
void Shape :: draw( ){ switch (k) { case circle:
// desenha o circulo break; case triangle:
// desenha o triangulo break; case square:
// desenha o quadrado break; } // end switch}
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 20/28
Polimorfismo – Outro Exemplo
• Problemas:– Funções como draw() precisam conhecer todos os tipos
de Shape que possam existir...– A função deve ser modificada toda vez que um novo Sha-
pe for adicionado ao sistema:✔ O código de draw é aumentado a cada inclusão de um Shape di-
ferente.
– Na realidade, todas as funções que trabalham com shapes terão que ser examinadas e modificadas!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 21/28
Polimorfismo – Outro Exemplo
• Problemas:– Um novo Shape poderá ser adicionado apenas no caso de
se ter acesso ao código fonte de todas as operações...– A parte de dados de Shape tem que ser escolhida de ma-
neira que acomode todas as possíveis representações de uma forma, seja ela qual for...
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 22/28
Polimorfismo – Outro Exemplo
• Pensando na solução:– Uma saída está em se agrupar o que é comum a todas as
Shapes (elas possuem uma forma, uma cor, podem ser de-senhadas, giradas, etc) em uma classe, e as propriedades e métodos específicos de triângulos, círculos e demais shapes em classes derivadas:
✔ Isso já foi visto: herança!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 23/28
Polimorfismo – Outro Exemplo
• Pensando na solução:
Circ le
draw()
Square
draw()
Triangle
draw()()
Shape
draw()
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 24/28
Polimorfismo – Outro Exemplo
• Problema da solução:– Seja o código a seguir:
class Shape {// ...public: void draw( ) { cout << “Shape::draw”; }};class Triangle : public Shape {// ...public: void draw( ) { cout << “Triangle::draw”;}};
void teste(Shape & a) { a.draw();}int main() { Triangle t; teste(t); // Vai chamar draw de Shape! E não de Triangle! }
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 25/28
Polimorfismo – Outro Exemplo
E agora, quem poderá nos ajudar?
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 26/28
O Chapolim Colorado?
O POLIMORFISMO É A SOLUÇÃO!
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 27/28
Importante
• Esta apresentação é uma adaptação do material ori-ginalmente desenvolvido pelo professor Renato Car-doso Mesquita, do Departamento de Engenharia Elé-trica da Universidade Federal de Minas Gerais.
http://www.cpdee.ufmg.br/~renato
24/08/15 Programação Orientada a Objetos – Renato Dourado Maia 28/28
That's All Folks!