A7_RedefiniçãoMétodos.pdf

download A7_RedefiniçãoMétodos.pdf

of 37

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