A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Pearson Education Slide 1. Pearson Education Slide 2 Cap í tulo 14 Criado por Frederick H. Colclough, Colorado Technical University Herança."— Transcrição da apresentação:

1 Pearson Education Slide 1

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

3 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

4 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 chamada heranç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

5 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

6 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

7 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ão as mesmas entre todos os empregados Assim, a classe geral pode conter todas essas coisas sobre empregados

8 Pearson Education Slide 8 Classe Empregado Muitos membros da classe Empregado se aplicam 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 desta classe

9 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 classe empregado emite uma mensagem de erro: imprimeCheque chamado por um tipo indiferenciado de empregado!! Abortar o programa…

10 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 membros da classe-base Pode-se então redefinir os membros existentes e/ou acrescentar novos membros

11 Pearson Education Slide 11 Interface para a classe derivada EmpregadoHorista Painel 14.3 página 406

12 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

13 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()

14 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 declarada na interface da classe EmpregadoHorista Novos e a serem redefinidos

15 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

16 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 inicializa todas as variáveis-membros da classe-base Aquelas herdadas pela classe derivada Então, o contrutor para a classe derivada simplesmente chama-o É aprimeira coisa que o construtor para a classe derivada faz

17 Pearson Education Slide 17 Exemplo de Construtor para Classe Derivada Considere a sintaxe de construtor para a classe EmpregadoHorista EmpregadoHorista::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

18 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

19 Pearson Education Slide 19 Construtor: Nenhuma chamada à Classe- Base Construtores da classe derivada sempre devem 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) { }

20 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-membros da classe em que elas estão definidas

21 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

22 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 indiretamente atravé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 simplesmente funções de ajuda Devem ser usadas somente nas classes em que foram definidas

23 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

24 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-membros herdadas 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

25 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

26 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 &

27 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 Empregado soniaH. imprimeCheque(); chama a função imprimeCheque de EmpregadoHorista soniaH.Empregado::imprimeCheque (); chama a função imprimeCheque de Empregado Não é comum aqui, mas útil algumas vezes

28 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

29 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

30 Pearson Education Slide 30 Exemplo de Operador de Atribuição Dado 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 classe derivada…

31 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

32 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

33 Pearson Education Slide 33 Destrutor: Ordem de Chamada Considere: Uma classe B derivada da classe A e 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

34 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

35 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-se protegidos na classe derivada Herança Privada : class EmpregadoMensalista : private Empregado {…} Todos os membros da classe-base tornam-se privados na classe derivada

36 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!

37 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

38 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


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

Apresentações semelhantes


Anúncios Google