A7_RedefiniçãoMétodos.pdf
-
Upload
jefferson-madeira -
Category
Documents
-
view
214 -
download
0
Transcript of A7_RedefiniçãoMétodos.pdf
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
1/37
HerançaRedefinição de Métodos
UNISUL, 2015
THIAGO FELSKI PEREIRA
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
2/37
Sumário
Herança Compilação
Redefinição de Métodos
Construtores e Destrutores em Classes Derivadas
Herança Pública vs. Privada vs. Protegida Conversões de Tipo entre Base e Derivada
Herança Múltipla Classes Base Virtuais
Compilação
Construtores em Herança Múltipla
2
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
3/37
Redefinição de Métodos
3
...
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
4/37
Redefinição de Métodos
Classes derivadas podem redefinir métodos da classebase A assinatura pode até mudar, embora o nome do método
permaneça
A precedência é do método redefinido na classe derivada Na verdade, este substitui o método da classe base na classe
derivada
Em caso de assinaturas diferentes, pode haver erro de compilaçãocaso tentemos chamar o método da classe base
A classe derivada pode chamar o método da classe base Desde que use o operador de escopo :: precedido pelo nome
da classe base
4
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
5/37
Redefinição de Métodos
É comum que métodos redefinidos chamem o métodooriginal dentro de sua redefinição e acrescentemfuncionalidades Como no exemplo anterior, em que frases adicionais são
impressas na redefinição do método print()
5
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
6/37
Construtores e Destrutores em Classes
Derivadas
6
...
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
7/37
Construtores e Destrutores em Classes
Derivadas
Como vimos no exemplo, instanciar uma classe derivadainicia uma cadeia de chamadas a construtores O construtor da classe derivada chama o construtor da classe
base antes de executar suas próprias ações
O construtor da classe base é chamada direta ouindiretamente (construtor default)
Considerando um hierarquia de classes mais extensa O primeiro construtor chamado é a última classe derivada
E é o último a ser executado
O último construtor chamado é o da classe base E é o primeiro a ser executado
7
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
8/37
Construtores e Destrutores em Classes
Derivadas
8
Classe
Base
Derivada
1
Derivada
2
Derivada
3
Chama o construtor
da base direta
Chama o construtorda base direta
Chama o construtorda base direta
Primeiro a serexecutado
Segundo a serexecutado
Terceiro a serexecutado
Último a ser
executado
Chama o construtorda classe
Instânci
a
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
9/37
Construtores e Destrutores em Classes
Derivadas
O contrário acontece em relação aos destrutores A execução começa pela classe derivada e é propagada até a
classe base
Considerando um hierarquia de classes mais extensa O primeiro destrutor chamado é a última classe derivada
E é também o primeiro a ser executado
O último construtor chamado é o da classe base E é também o último a ser executado
9
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
10/37
Construtores e Destrutores em Classes
Derivadas
10
Classe
Base
Derivada
1
Derivada
2
Derivada
3
Executa e depois chama
o destrutor da base direta
Chama o destrutorda classe
Instância
Executa e depois chamao destrutor da base direta
Executa e depois chamao destrutor da base direta
Último destrutora ser chamado
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
11/37
Construtores e Destrutores em Classes
Derivadas
Caso um atributo de uma classe derivada seja um objetode outra classe Seu construtor será o primeiro a ser executado
Seu destrutor será o último a ser executado
Atenção!
Construtores e destrutores de uma classe base não sãoherdados
No entanto, podem ser chamados pelos construtores edestrutores das classes derivadas
11
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
12/37
Herança
Pública vs. Privada vs. Protegida
12
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
13/37
Herança
Pública vs. Privada vs. Protegida
Herança Pública Os membros públicos da classe base serão membros públicos da classe
derivada Poderão ser acessados por objetos da classe derivada
Os membros protegidos da classe base serão membros protegidos da classe
derivada Herança Privada
Tantos os membros públicos quanto os protegidos da classe base serãomembros privados da classe derivada
Acessíveis aos membros da classe derivada, mas não aos seus objetos
Herança Protegida Tantos os membros públicos quanto os protegidos da classe base serão
membros protegidos da classe derivada Disponíveis aos membros da classe derivada e as que herdarem dela; Um objeto da classe derivada não terá acesso a nenhum membro da classe derivada
13
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
14/37
Herança
Pública vs. Privada vs. Protegida
class Base
{
protected:
int protegido;
private:
int privado;
public:int publico;
};
14
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
15/37
Herança
Pública vs. Privada vs. Protegida
class Derivada1: public Base
{
private:
int a, b, c;
public:
Derivada1(){
a = protegido;b = privado;//ERRO: Não acessível
c = publico;
}
};
15
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
16/37
Herança
Pública vs. Privada vs. Protegida
class Derivada2: private Base
{
private:
int a, b, c;
public:
Derivada2(){
a = protegido;b = privado;//ERRO: Não acessível
c = publico;
}
};
16
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
17/37
Herança
Pública vs. Privada vs. Protegida
class Derivada3: protected Base
{
private:
int a, b, c;
public:
Derivada3(){
a = protegido;b = privado;//ERRO: Não acessível
c = publico;
}
};
17
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
18/37
Herança
Pública vs. Privada vs. Protegidaint main()
{int x;
Derivada1 HPublica;
x = HPublica.protegido; //ERRO: Não acessível
x = HPublica.privado; //ERRO: Não acessível
x = HPublica.publico; //OK
Derivada2 HPrivada;
x = HPrivada.protegido; //ERRO: Não acessível
x = HPrivada.privado; //ERRO: Não acessível
x = HPrivada.publico; //ERRO: Não acessível
Derivada3 HProtegida;
x = HProtegida.protegido; //ERRO: Não acessível
x = HProtegida.privado; //ERRO: Não acessível
x = HProtegida.publico; //ERRO: Não acessível
return 0;
}
18
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
19/37
Herança
Pública vs. Privada vs. Protegida
19
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
20/37
Conversões de Tipo entre Base e Derivada
20
...
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
21/37
Herança
Se necessário, podemos converter um objeto de uma classe
derivada em um objeto da classe base A classe base pode conter menos atributos que a classe derivada
Os atributos em comum são copiados Os atributos extras são desperdiçados
O contrário não pode ser feito Conversão de um objeto da classe base para um objeto da classederivada
A conversão de tipos está intimamente relacionada com oPolimorfismo, que veremos em breve
Para nosso exemplo, consideremos duas classes: Base e Derivada Em que a segunda herda da primeira
21
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
22/37
Conversões de Tipo entre Base e Derivada
int main()
{
Base obj1;
Derivada obj2;
obj1.get(); //”Preenche” o objeto.
obj2.get(); //”Preenche” o objeto.
obj1 = obj2; //OK.
obj2 = obj1; //ERRO! Não pode ser convertido.
return 0;}
22
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
23/37
Herança Múltipla
23
...
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
24/37
Herança Múltipla
Uma classe pode ser derivada a partir de mais que umaclasse base Caracterizando assim a herança múltipla
A complexidade relacionada à herança múltipla dizrespeito ao projeto do relacionamento das classes A sintaxe é similar à herança simples;
Após o cabeçalho da classe derivada, usamos : e listamos asclasses a serem herdadas, separadas por vírgula e com
modificadores de acesso individuais.
class Derivada: public Base1, public Base2
24
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
25/37
Herança Múltipla
Considere para nosso exemplo que queremos modelar oregistro de imóveis de uma imobiliária que trabalha apenascom vendas Já possuímos uma classe Cadastro que utilizamos para outros fins
Já possuímos também uma classe Imóvel, que armazena os dados de
um imóvel Decidimos então não modificar as classes, e criar a classe Venda
Vamos incorporar o cadastro do dono e do imóvel a partir das nossasclasses já existentes
Resolvemos criar uma classe Tipo, que determina se o imóvel éresidencial, comercial ou galpão
Como último detalhe, os dados sobre comprador não sãointeressantes para a classe Venda
25
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
26/37
Cadastro.h e Cadastro.cpp
#include
using namespace std;
class Cadastro
{
private:
string nome, fone;
public:
void setNome();
void setFone();void print();
};
#include
using namespace std;
#include "Cadastro.h"
void Cadastro::setNome()
{cout
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
27/37
Imovel.h #include
using namespace std;
class Imovel{
private:
string endereco, bairro;float areaUtil, areaTotal;int quartos;
public:
void setEndereco();void setBairro();void setAreaUtil();void setAreaTotal();void setQuartos();void print();
};
27
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
28/37
Imovel.cpp #include
using namespace std;
#include "Imovel.h"
void Imovel::setEndereco()
{
cout
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
29/37
Tipo.h e Tipo.cpp
#include
using namespace std;
class Tipo
{
private:
string tipoImovel;
public:
void setTipoImovel();
void print();};
#include
using namespace std;
#include "Tipo.h"
void Tipo::setTipoImovel()
{
cout
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
30/37
Venda.h #include
using namespace std;
#include"Cadastro.h"
#include"Imovel.h"
#include"Tipo.h"
class Venda: private Cadastro, Imovel, Tipo
{
private:
float valor;
public:
void set();
void print();
};
30
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
31/37
Herança Múltipla
A classe Venda realiza herança privada Os métodos da classe base não são acessíveis aos objetos
Atenção!
Herdando da classe Cadastro, a classe Venda só terá espaçopara os dados de um único cadastro
Se quiséssemos cadastrar o comprador, não seria possível Um objeto da classe Cadastro resolveria este “problema”
Não é possível herdar duas vezes da mesma classe
31
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
32/37
Venda.cpp #includeusing namespace std;
#include"Venda.h"
void Venda::set(){
cout
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
33/37
Diagrama de Classes
33
+setNome()
+setFone()
+print()
-nome : char
-fone : char
Cadastro
+setEndereco()+setBairro()
+setAreaUtil()
+setAreaTotal()
+setQuartos()
+print()
«signal»-()
-endereco : char
-bairro : char
-aeraUtil : float
-areaTotal : float
-quartos : double
Imovel
+setImovel()
+print()
-tipoImovel : char
Tipo
+set()
+print()
-valor : float
Venda
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
34/37
Ambiguidade em
Herança Múltipla
Note que todas as classes base possuem um método print()
Dentro da classe derivada, devemos informar ao compilador aqual classe estamos nos referindo
Utilizamos o nome da classe, o operador de escopo e o nomedo método para que fique claro
Base::metodo();
No caso de herança pública, o objeto que chame o
método também deve usar o nome da classe e ooperador de escopo
obj.Base::metodo();
34
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
35/37
driverVenda.cpp #include
using namespace std;
#include"Venda.h"
int main()
{
Venda galpao;
galpao.set();
galpao.print();
}
35
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
36/37
Saída do Método print()
Proprietário:
Nome: marco
Telefone: 3552-1663
Imóvel:
Endereço: Campus Morro do CruzeiroBairro: Bauxita
Área Útil: 8
Área Total: 8
Quartos: 0Tipo do Imóvel: Sala
Valor: R$0
36
-
8/15/2019 A7_RedefiniçãoMétodos.pdf
37/37