pearson education slide 1. pearson education slide 2 cap í tulo 14 criado por frederick h....
TRANSCRIPT
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
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
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
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
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
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
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…”
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
Pearson Education Slide 11
Interface para a classe derivada EmpregadoHorista
Painel 14.3
página 406
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
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()
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’
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
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
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
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
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){ }
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
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
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
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
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
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
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 &
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
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
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
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…
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
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
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
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
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
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!
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
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