Baixe o app para aproveitar ainda mais
Prévia do material em texto
POO – Herança e Polimorfismo Aplicados à linguagem de programação C++ diegoquirino@gmail.com 1 Aula 6 Agenda 1.Herança e Polimorfismo em C++ 2. Interação entre Objetos diegoquirino@gmail.com 2 Escopo: Conceitos de POO diegoquirino@gmail.com 3 Abstração Encapsulamento Objetos ClassesAtributos e MétodosConstrutores Herança e Polimorfismo Modularização Interação entre objetos Escopo Herança e Polimorfismo Na linguagem C++ diegoquirino@gmail.com 4 Templates 1. O mecanismo baseado em typedef permite criar rotinas genéricas. • Mas, não é suficiente se queremos rotinas que funcionem com dois tipos diferentes. 2. Uma template não é uma função comum, mas sim um padrão para criar funções. 3. É criada para variar os tipos que estão em uso por uma conjuntura padrão (template) de uma classe 4. A template é expandida (como uma macro) para prover uma função real. • O compilador gera código a partir da template para cada combinação diferente de parâmetros. diegoquirino@gmail.com 5 Templates Exemplo diegoquirino@gmail.com 6 //VAMOS DEFINIR A CALCULADORA GENÉRICA, NÃO IMPORTA O TIPO! #ifndef CALCULADORA_HPP #define CALCULADORA_HPP template <class T> class Calculadora{ private: T numA, numB; public: Calculadora(T numA, T numB); ~Calculadora(); T somar(); T subtrair(); }; #endif // CALCULADORA_HPP ... (CONTINUA) Templates Exemplo diegoquirino@gmail.com 7 //VAMOS IMPLEMENTAR CONST./DEST./MÉTODOS DA CALCULADORA! ... (CONTINUAÇÃO) template <class T> Calculadora<T>::Calculadora(T numA, T numB){ this->numA = numA; this->numB = numB; } template <class T> Calculadora<T>::~Calculadora(){ delete &numA; delete &numB; } template <class T> T Calculadora<T>::somar(){ return this->numA + this->numB; } É sempre necessário informar a classe template que você está usando Herança 1. O principal objetivo de programação orientada a objeto seja a reutilização de código. 2. Templates são apropriadas quando a funcionalidade básica do código é a mesma independente de tipo. 3. Herança serve para estender a funcionalidade de um objeto. 4. Criam-se novos tipos com propriedades restritas ou estendidas do tipo original. diegoquirino@gmail.com 8 Polimorfismo 1. Polimorfismo permite que um objeto possa armazenar vários tipos diferentes de objetos. 2. Quando uma operação for aplicada a um objeto polimorfo será selecionada automaticamente aquela adequada ao tipo armazenado. 3. Sobreposição (override) de funções e operadores é um exemplo de polimorfismo (reutilização da implementação). • Neste caso, a seleção da função é feita em tempo de compilação, o que limita o comportamento polimorfo. diegoquirino@gmail.com 9 //VAMOS IMPLEMENTAR A SUPERCLASSE ANIMAL! #ifndef ANIMAL_HPP #define ANIMAL_HPP using namespace std; class Animal{ private: string nome; public: Animal(string nome){ this->nome = nome; } string getNome(){ return this->nome; } void setNome(string nome){ this->nome = nome; } virtual string tipoDeLocomocao() { return "Não Definido"; } }; #endif // ANIMAL_HPP Herança + Polimorfismo diegoquirino@gmail.com 10 //VAMOS IMPLEMENTAR AS CLASSES FILHAS!! class Terrestre : public Animal{ public: Terrestre(string nome): Animal(nome) { setNome(nome); } virtual string tipoDeLocomocao() { return("Pela Terra"); } }; ... //Termine o trabalho você mesmo!!! :D Herança + Polimorfismo : Exemplo diegoquirino@gmail.com 11 09/04/2024 carlos.diego@computacao.ufcg.edu.br 12 Herança Múltipla Herança Múltipla A herança múltipla em programação orientada a objetos (POO) permite que uma classe herde características e comportamentos de mais de uma classe base. 09/04/2024 carlos.diego@computacao.ufcg.edu.br 13 é Animal Ave e Mamífero = Morcego Animal.hpp (Classe Abstrata não pode ser inicializada) 09/04/2024 carlos.diego@computacao.ufcg.edu.br 14 #include <iostream> #include <string> using namespace std class Animal { protected: Hummm, enfim usamos protected (protegido) string nome; public: Animal(string nome) : nome(nome) {} virtual string mover() = 0; }; Método puro virtual Mamifero.hpp 09/04/2024 carlos.diego@computacao.ufcg.edu.br 15 #include <iostream> #include <string> using namespace std class Mamifero : virtual public Animal { (note que não é preciso redefinir ‘protected str nome’) public: Mamifero(string nome) : Animal(nome) {} string mover() override { return nome + " está andando."; } }; A herança virtual é um mecanismo que C++ fornece para resolver problemas específicos que podem surgir em situações complexas de herança múltipla Problema do Diamante 16 O problema do diamante O "problema do diamante" ocorre em herança múltipla quando uma classe deriva de duas classes que têm uma base comum, e essa classe base é herdada duas vezes. Sem herança virtual, isso resultaria em duas cópias separadas da classe base, levando a ambiguidades e problemas de redundância de dados. 09/04/2024 carlos.diego@computacao.ufcg.edu.br 17 Ave.hpp 09/04/2024 carlos.diego@computacao.ufcg.edu.br 18 #include <iostream> #include <string> using namespace std class Ave : virtual public Animal { (note que não é preciso redefinir ‘protected str nome’) public: Ave(string nome) : Animal(nome) {} string mover() override { return nome + " está voando."; } }; Morcego.hpp (herança múltipla) 09/04/2024 carlos.diego@computacao.ufcg.edu.br 19 #include <iostream> #include <string> using namespace std class Morcego : public Mamifero, public Ave { (note que não é preciso redefinir ‘protected str nome’) public: Morcego(string nome) : Animal(nome), Mamifero(nome), Ave(nome) {} string mover() override { return Mamifero::mover() + " E também " + Ave::mover(); }}; Vejamos na Prática Interação entre objetos diegoquirino@gmail.com 20 REVISÃO GERAL DO CONTEÚDO APRESENTADO 09/04/2024 diegoquirino@gmail.com 21 O que aprendemos? Atividade prática e exercícios 09/04/2024 diegoquirino@gmail.com 22 Agora é a sua vez! Referências 09/04/2024 diegoquirino@gmail.com 23 Além de sites sugeridos no decorrer das aulas... DEITEL, H.M; DEITEL, P. J. C++ Como Programar. 5ª Ed. Editora Pearson Prentice Hall, 2006. MIZRAHI, V.V. Treinamento em Linguagem C++. 2ª ed. Editora Pearson Prentice Hall, 2006. ROGERS, Y.; SHARP, H.; PREECE, J. UML & C++: Guia prático de desenvolvimento orientado a objetos. 1ª Ed. Editora Pearson Prentice Hall, 2001. Aula 6 Agenda Escopo:�Conceitos de POO Herança e Polimorfismo Templates Templates Exemplo Templates Exemplo Herança Polimorfismo Herança + Polimorfismo Herança + Polimorfismo : Exemplo Herança Múltipla Herança Múltipla Animal.hpp (Classe Abstrata não pode ser inicializada) Mamifero.hpp Problema do Diamante O problema do diamante Ave.hpp Morcego.hpp (herança múltipla) Vejamos na Prática O que aprendemos? Agora é a sua vez! Referências
Compartilhar