Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H....

38
Pearson Education Slide 1

Transcript of Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H....

Page 1: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 1

Page 2: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 2

Capítulo 14

Criado por Frederick H. Colclough, Colorado Technical University

Herança

Page 3: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 3

Objetivos de Estudo Fundamentos da Herança

Classes Derivadas, com construtores protected: Qualificador Redefinição de funções-membros Funções não-herdadas

Programando com Herança Operadores de atribuição e construtores de

cópia Destrutores em classes derivadas Herança múltipla

Page 4: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 4

Introdução à herança Programação Orienteda a Objetos

Técnica poderosa de programação Fornece uma dimensão de abstração

chamadaherança

Forma geral da classe é definida Versões especializadas herdarão então,

propriedades da classe geral E acrescentam/modificam a funcionalidade

para uso apropriado

Page 5: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 5

Fundamentos de Herança Novas classes herdadas de outras classes Classe-base

Classe ‘geral’ da qual outras derivam Classe derivada Classe nova Automaticamente possui da classe geral:

Variáveis-membros Funções-membros

Pode-se então acrescentar funções-membros e

variáveis

Page 6: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 6

Classes Derivadas Considere o exemplo:

Classe de ‘Empregado’ Composta de:

Empregados mensalistas Empregados horistas

Ambos são ‘subconjuntos’ de Empregado

Outros talvez recebam salários fixos, pagos mensalmente ou semanalmente

Page 7: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 7

Classes Derivadas Não é ‘necessário’ um tipo geral de

‘Empregado’ Pensar em termos gerais pode ser útil!

Todos possuem nomes E números da Previdência Social Funções associadas a estes tipos ‘básicos’

sãoas mesmas entre todos os empregados

Assim, a classe ‘geral’ pode conter todasessas ‘coisas’ sobre empregados

Page 8: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 8

Classe Empregado Muitos membros da classe ‘Empregado’

seaplicam a todos os tipos de empregados

Funções accessor Funções mutator Mais dados:

INSS Nome PagLiq

Porém, nós não teremos ‘objetos’ destaclasse

Page 9: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 9

Classe Empregado Considere a função imprimeCheque():

Será sempre ‘redefinida’ em classes derivadas Assim, diferentes tipos de empregados podem

ter diferentes cheques Realmente não faz sentido para um empregado

‘indiferenciado’Então a função imprimeCheque() na classeempregado emite uma mensagem de erro:

imprimeCheque chamado por um tipo indiferenciado de empregado!! Abortar o programa…”

Page 10: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 10

Derivando da Classe Empregado Classes derivadas da Classe Empregado:

Automaticamente possuem todas as variáveis-membros

Automaticamente possuem todas as funções-membros

Dizemos que classe derivada ‘herda’ membrosda classe-base

Pode-se então redefinir os membros existentese/ou acrescentar novos membros

Page 11: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 11

Interface para a classe derivada EmpregadoHorista

Painel 14.3

página 406

Page 12: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 12

Interface para a classe EmpregadoHorista

Observe que a definição começa como

qualquer outra definição de classe Estrutura #ifndef Inclui as bibliotecas necessárias Também inclui employee.h!

E, o cabeçalho:class EmpregadoHorista : public Empregado

{ … Especifica ‘publicamente herdado’ da classe

Empregado

Page 13: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 13

Classe EmpregadoHorista: Acréscimos A definição da classe derivada somente lista

membros novos ou ‘que serão redefinidos’ Uma vez que todos os outros herdados já estão

definidos ex.: ‘Todos’ os empregados possuem inss, nome,

etc.

EmpregadoHorista acrescenta: Construtores Variáveis membros taxaRemun e horas Funções-membros setTaxa(), getTaxa(),

setHoras() e getHoras()

Page 14: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 14

Redefinições da Classe EmpregadoHorista Classe EmpregadoHorista redefine:

A função-membro imprimeCheque() Ela ‘sobrescreve’ a implementação da

função

imprimeCheque() da classe Empregado Sua definição precisa estar na Implementação

da classe EmpregadoHorista Como faria com outra função-membro

declaradana interface da classe EmpregadoHorista

Novos e ‘a serem redefinidos’

Page 15: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 15

Terminologia de Herança Simulam as relações familiares Classe Pai

Refere-se a classe-base Classe Filha

Refere-se a classe derivada Classe ancestral

Classe que é pai do pai… Classe Descendente

O oposto de ancestral

Page 16: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 16

Construtores em Classes Derivadas Um construtor em uma classe-base NÃO

é herdado na classe derivada! Mas podem ser invocados dentro de um

construtor da classe derivada Que é tudo que precisamos!

Um construtor para uma classe-base inicializatodas as variáveis-membros da classe-base

Aquelas herdadas pela classe derivada Então, o contrutor para a classe derivada

simplesmente chama-o É a‘primeira coisa’ que o construtor para a classe derivada

faz

Page 17: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 17

Exemplo de Construtor para Classe Derivada

Considere a sintaxe de construtor para aclasse EmpregadoHoristaEmpregadoHorista::EmpregadoHorista(string oNome,

string oNumero, double aTaxaRemun, double asHoras)

: Empregado(oNome, oNumero),

taxaRemun(aTaxaRemun), horas(asHoras)

{

//propositadamente vazio

}

O trecho depois de “:” é a ‘seção de inicialização’ Inclui a invocação do construtor de Empregado

Page 18: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 18

Outro Construtor para EmpregadoHorista

Um segundo construtor:EmpregadoHorista::EmpregadoHorista( ) : Empregado( ), taxaRemun(0),

horas(0)

{

//propositadamente vazio

}

A versão-padrão do construtor da classe-base é chamada (Sem argumentos)

Sempre deve-se incluir uma chamada a um dos construtores da classe-base

Page 19: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 19

Construtor: Nenhuma chamada à Classe-Base

Construtores da classe derivada sempredevem invocar um dos construtores da

classe-base Se você não o fizer:

O construtor-padrão da classe-base automaticamente será chamado

Definição equivalente de construtor:EmpregadoHorista:: EmpregadoHorista()

: taxaRemun(0), horas(0){ }

Page 20: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 20

Armadilha: Dados Privados da Classe-Base

Classes derivadas ‘herdam’ variáveis-membros privadas

Mas não podem acessá-las diretamente Nem mesmo através de funções-membros da classe derivada!

Variáveis-membros privadas podem SOMENTE

ser acessadas ‘por nome’ nas funções-membrosda classe em que elas estão definidas

Page 21: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 21

Armadilha: Funções-Membros Privadas da Classe-Base

O mesmo se aplica para funções-membros

da classe-base Não podem ser acessadas de fora da interface

e implementação da classe-base Nem mesmo em definições de funções-membros

da classe-derivada

Page 22: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 22

Armadilha: Impacto das Funções-Membros Privadas da Classe-Base

Grande impacto aqui vs. variáveis-membros Variáveis-membros podem ser acessadas

indiretamenteatravés das funções-membros accessor ou mutator

Funções-membros simplesmente não estão

disponíveis Isto é ‘razoável’

Funções-membros privadas devem ser simplesmentefunções de ‘ajuda’

Devem ser usadas somente nas classes em

que foram definidas

Page 23: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 23

O Qualificador protected Nova classificação de membros da classe Permite o acesso ‘por nome’ nas classes

derivadas mas em nenhum outro lugar Nenhum acesso ‘por nome’ em outras classes

Nas classes em que estão definidas atuam como privadas

Consideradas ‘protegidas’ nas classes derivadas Para permitir futuras derivações

Muitos consideram isso uma ‘violação’ ao princípio de

ocultar as informações

Page 24: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 24

Redefinição de Funções-Membros Lembre-se da definição das classes derivadas:

Contém declarações para novas funções-membros Também contém declarações para funções-

membrosherdadas que serão modificadas

Funções-membros herdadas e NÃO declaradas:

Automaticamente herdadas inalteradas

Implementação da classe derivada: Definirá novas funções-membros Redefinirá funções herdadas declaradas

Page 25: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 25

Redefinição vs. Sobrecarga Muito diferente! Redefinição em uma classe derivada:

MESMA lista de parâmetros Basicamente ‘reescreve’ a mesma função

Sobrecarga: lista de parâmetros diferente Definida ‘nova’ função que usa parâmetros

diferentes Funções sobrecarregadas devem ter assina-

turas diferentes

Page 26: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 26

Uma Assinatura de Função Lembre-se da definição de Assinatura’:

Nome da função Seqüência de tipos da lista de parâmetros

Incluindo ordem, número, tipos

Assinatura NÃO inclue: Tipo de retorno Palavra-chave const O e comercial &

Page 27: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 27

Acesso à uma Função-Base Redefinida Quando redefinida na classe derivada, a

definição na classe-base não é ‘perdida’ Pode-se especificar seu uso:

Empregado JaneE;EmpregadoHorista SoniaH;JaneE.imprimeCheque(); chama a função imprimeCheque

de EmpregadosoniaH. imprimeCheque(); chama a função imprimeCheque

de EmpregadoHoristasoniaH.Empregado::imprimeCheque (); chama a função

imprimeCheque de Empregado

Não é comum aqui, mas útil algumas vezes

Page 28: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 28

Funções Não-Herdadas Todas as Funções ‘normais’ da clase-base

são herdadas na classe derivada Exceções:

Construtores (nós já vimos) Destrutores Construtor de cópia

Mas se não for definido, C++ gerará um ‘padrão’ Lembre-se que é preciso definir um para ponteiros!

Operador de Atribuição Se não for definido padrão

Page 29: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 29

Operadores de Atribuição e Construtores de Cópia

Lembre-se: Operadores de atribuição sobre-carregados e contrutores de cópia NÃO são

herdados mas podem ser usados na definição das

classes derivadas Tipicamente DEVEM ser usados! Semelhante a como construtores na classe

derivada invocam construtores na classe-base

Page 30: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 30

Exemplo de Operador de AtribuiçãoDado ‘Derivada’ uma classe derivada de ‘Base’:

Derivada& Derivada::operator =(const Derivada& ladoDir)

{

Base::operator =(ladoDir);

}

Observe a linha de código Chama o operador de atribuição da classe-

base Isso resolve a questão das variáveis-membros

herdadas

Então fixará novas variáveis da classederivada…

Page 31: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 31

Exemplo de Construtor de Cópia Considere:

Derivada::Derivada(const Derivada& Objeto): Base(Object), …

{…} Depois de “:” é uma invocação do construtor

de cópia da clase-base fixa as variáveis-membros herdadas da classe

objeto derivada que é criada Como Objeto é de tipo Derivada, é também de tipo Base,

Objeto é um argumento válido

Page 32: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 32

Destrutores em Classes Derivadas Se um destrutor da classe-base funciona corretamente

É fácil escrever um destrutor para a classe derivada Quando o destrutor para a classe derivada é invocado:

Automaticamente invoca o destrutor da classe-base! Não é necessário uma chamada explícita

Assim, o destrutor da classe derivada precisa se preocupar somente com as variáveis da classe derivada

E quaisquer dados para os quais apontem Destrutor da classe-base manipula dados

herdados automaticamente

Page 33: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 33

Destrutor: Ordem de Chamada Considere:

Uma classe B derivada da classe Ae uma classe C derivada da classe B

A B C Quando um objeto da classe C sair fora do escopo:

Primeiro o destrutor da classe C é chamado Depois o destrutor da classe B Finalmente o destrutor da classe A é

chamado Inverso a ordem em que os construtores

são chamados

Page 34: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 34

Relacionamentos “É Um(a)” Versus “Tem Um(a)”

Herança Considerada um relacionamento “É um” ex.: Um EmpregadoHorista “é um”

Empregado Um Conversível “é um” Automóvel

Uma classe pode conter objetos de outra classe

como suas variáveis-membros Considerado um relacionamento “Tem um” ex.: Uma classe “Tem um” objeto de outra

classe como seus dados

Page 35: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 35

Herança Protegida e Privada Novas ‘formas’ de Herança

Ambas são raramente usadas Herança Protegida:

class EmpregadoMensalista : protected Empregado{…}

Membros públicos na classe-base tornam-seprotegidos na classe derivada

Herança Privada :class EmpregadoMensalista : private Empregado {…}

Todos os membros da classe-base tornam-seprivados na classe derivada

Page 36: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 36

Herança Múltipla Uma classe derivada pode ter mais do

que uma classe-base! A sintaxe simplesmente inclui todas as

classes-bases separadas por vírgulas:class derivadaMuti : public base1, base2{…}

Infinitas possibilidades de ambigüidades! Perigoso!

Alguns acreditam que nunca deveria ser usada Certamente deve ser usada somente por

programadores experientes!

Page 37: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 37

Sumário 1 Herança fornece código para reutilização

Permite a uma classe ‘derivar’ de outra, acres-centando-se recursos

Os objetos da classe derivada herdam

os membros da classe-base e podem ter membros acrescentados.

Variáveis-membros privadas na classe-base não podem ser acessadas ‘por nome’ na derivada

Funções-membros privadas não são herdadas

Page 38: Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança.

Pearson Education Slide 38

Sumário 2 Pode-se redefinir funções-membros herdadas

Para trabalhar de modo diferente na classe derivada

Membros protegidos na classe-base: Podem ser acessados ‘por nome’ nas funções-

membros da classe derivada O operador de atribuição sobrecarregado não

é herdado Mas pode ser invocado da classe derivada Construtores não são herdados

São invocados de construtores das classes derivadas