Buscar

Aula06-POO-Heranca-Cpp (1)

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

Continue navegando