Programação em Linguagem C++ Igor Kondrasovas Especialista em Computação Aplicada UDESC Sócio e Desenvolvedor na Inovativa Tecnologia igor@inovativatec.com www.inovativatec.com
Agenda Herança e Polimorfismo Herança Funções Virtuais Polimorfismo
Mas antes... Sobre a última aula Utilizando a classe string Inicializando vetores no heap 3
Generalização / Especialização Um cão é um canino; Um canino é um mamífero; Taxinomistas dividem os seres vivos em Reinos, filos, classes, ordens, famílias, gêneros e espécies 4
Exemplo 5
Porque Utilizamos os Animais? Facilita a discussão sobre herança; Imagem que estamos fazendo um jogo que simula uma fazenda; Por agora, os métodos fazem coisas simples; 6
7
Demo 1: Classe Cão derivada da classe Mamífero Referência: Figura 12.2 8
Private x Protected Visível para a classe e para as classes derivadas 9
Construtores e Destrutores Quando um objeto Cão é criado, o seu construtor base é chamado primeiramente, criando um Mamífero. Então o construtor de Cão é chamado, completando a construção do objeto. Quando o objeto é destruído, primeiro o destrutor de Cão é chamado e posteriormente o destrutor de Mamífero. 10
Demo 2: Verificar construtores e destrutores da classe cão; Referência: Figura 12.3 11
Construtores e Destrutores Como podemos inicializar valores no construtor base? Inicialização da classe base pode ser feita durante a inicialização da classe escrevendo o nome da classe base, seguido dos parâmetros esperados por ela. 12
Demo 3: Verificar inicialização de construtores da classe base; Referência: Figura 12.4 13
Sobrescrita de Métodos Um objeto Cao tem acesso a todos os dados membros e métodos (funções) da classe Mamifero, assim como todos os seus próprios membros e métodos. Uma classe derivada pode também sobrescrever (override) um método da classe base; 14
Sobrescrita de Métodos Quando uma classe derivada cria um método com o mesmo tipo de retorno e assinatura de um método de uma classe base, mas com uma nova implementação, dizemos que ela esta sobrescrevendo o método. OBS: O tipo de retorno pode ser diferente; 15
Demo 4: Verificar sobrescrita de método da classe Cao; Referência: Figura 12.5 16
Importante! Sobrecarga vs Sobrescrita Overload vs Overriding 17
Ocultando Métodos Após sobrescrever um método sobrecarregado, todos as outras sobrecargas são escondidas (hidden). Se você quer evitar isto, sobrescreva todos os métodos; 18
Demo 5: Demonstrar hidding de métodos; Referência: Figura 12.6 19
Chamando Métodos da Base 20
Demo 6: Demonstrar chamada ao método da base; Referência: Figura 12.7 21
Polimorfismo C++ permite que ponteiros para classes base sejam inicializados com objetos de classes derivadas: Ex: Mamifero* panimal = new Cao; É possível utilizar este ponteiro para chamar qualquer método de Mamífero. E se quisermos chamar os métodos da classe Cao? 22
Funções Virtuais Para criar um método virtual, basta adicionar a palavra virtual na frente da declaração do método; 23
Demo 7: Utilizar o método Falar para demonstrar métodos virtuais; Referência: Figura 12.7 24
Perguntas e Respostas Se Cão deriva de Mamífero, e Mamífero deriva de Animal, a classe Cão herdará os métodos e atributos de Animal? Sim. A medida que a derivação continua, as classes derivadas herdam a soma de todos os métodos e atributos de suas classes bases, mas podem acessar apenas aqueles que são públicos ou protegidos. 25
Perguntas e Respostas Se, na pergunta anterior, Mamífero sobrescrever um método de Animal, qual destes métodos estará disponível para Cão, a versão original ou a sobrescrita? Se Cão deriva de Mamífero, ele obtém a versão sobrescrita. 26
Programação em Linguagem C++ Igor Kondrasovas Especialista em Computação Aplicada UDESC Sócio e Desenvolvedor na Inovativa Tecnologia igor@inovativatec.com www.inovativatec.com