programação orientada a objetos para redes de - gta.ufrj.brmiguel/docs/progredes/aula7f.pdf ·...

18
1 Programação Orientada a Objetos para Redes de Computadores Prof. Miguel Elias Mitre Campista http://www.gta.ufrj.br/~miguel POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Programação em C++ - Polimorfismo PARTE 2 POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Polimorfismo com Hierarquias de Herança Polimorfismo permite: “Programar no geral” ao invés de ‘”programar no específico” Processar objetos de classes da mesma hierarquia Como se fossem todos objetos da classe base Cada objeto executa as tarefas que lhe são pertinentes Diferentes ações ocorrem, dependendo do tipo de objeto Novas classes podem ser adicionadas Com pouca ou nenhuma modificação no código existente POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Exemplo: Hierarquia Animal Classe base Animal Toda classe derivada tem a função move Diferentes objetos Animal são mantidos como um vector de ponteiros Animal O programa emite a mesma mensagem (move) a cada animal genericamente A função apropriada é chamada – Peixe movimenta-se (move) nadando – Sapo movimenta-se (move) pulando – Pássaro movimenta-se (move) voando POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Exemplos de Polimorfismo O polimorfismo ocorre quando um programa invoca uma função virtual por meio de um ponteiro ou referência de classe base C++ escolhe dinamicamente a função correta para a classe na qual o objeto foi instanciado POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista Observações de Engenharia de Software Funções virtual combinadas com o polimorfismo permitem tratar de generalidades e deixar as questões específicas dos objetos para o ambiente em tempo de execução É possível direcionar uma variedade de objetos a se comportar de maneira apropriada sem mesmo conhecer seus tipos Contanto que esses objetos pertençam à mesma hierarquia de herança e estejam sendo acessados por meio de um ponteiro de classe base comum POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Upload: lamkiet

Post on 30-Nov-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

1

Programação Orientada a Objetos para Redes de

Computadores

Prof. Miguel Elias Mitre Campista

http://www.gta.ufrj.br/~miguel

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Programação em C++ - Polimorfismo

PARTE 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Polimorfismo com Hierarquias de Herança

• Polimorfismo permite: – “Programar no geral” ao invés de ‘”programar no

específico”

– Processar objetos de classes da mesma hierarquia • Como se fossem todos objetos da classe base

• Cada objeto executa as tarefas que lhe são pertinentes – Diferentes ações ocorrem, dependendo do tipo de

objeto

• Novas classes podem ser adicionadas – Com pouca ou nenhuma modificação no código existente

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo: Hierarquia Animal

• Classe base Animal – Toda classe derivada tem a função move

• Diferentes objetos Animal são mantidos como um vector de ponteiros Animal

• O programa emite a mesma mensagem (move) a cada animal genericamente

• A função apropriada é chamada – Peixe movimenta-se (move) nadando – Sapo movimenta-se (move) pulando – Pássaro movimenta-se (move) voando

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplos de Polimorfismo

• O polimorfismo ocorre quando um programa invoca uma função virtual por meio de um ponteiro ou referência de classe base – C++ escolhe dinamicamente a função correta para a classe na

qual o objeto foi instanciado

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Observações de Engenharia de Software

• Funções virtual combinadas com o polimorfismo permitem tratar de generalidades e deixar as questões específicas dos objetos para o ambiente em tempo de execução

– É possível direcionar uma variedade de objetos a se comportar de maneira apropriada sem mesmo conhecer seus tipos

• Contanto que esses objetos pertençam à mesma hierarquia de herança e estejam sendo acessados por meio de um ponteiro de classe base comum

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

2

Observações de Engenharia de Software

• O polimorfismo promove extensibilidade

– O software escrito para invocar comportamento polimórfico é escrito independentemente dos tipos de objeto para os quais as mensagens são enviadas

• É possível incorporar nesse sistema novos tipos de objeto que podem responder a mensagens existentes sem modificar o sistema de base

• Somente o código do cliente que instancia os novos objetos deve ser modificado para acomodar os novos tipos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Relacionamento de Objetos em Hierarquia de Herança

• Conceito-chave

– Um objeto de uma classe derivada pode ser tratado como um objeto de sua classe base

• Objeto da classe derivada “é um” objeto da classe base

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Uso de Fçs. de Classe Base de Obj’s de Classe Derivada

• Apontar um ponteiro de classe base para um objeto de classe base – Invoca a funcionalidade da classe base

• Apontar um ponteiro de classe derivada para um objeto de classe derivada – Invoca a funcionalidade da classe derivada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Uso de Fçs. de Classe Base de Obj’s de Classe Derivada

• Apontar um ponteiro de classe base para um objeto de classe derivada – Objeto de classe derivada é um objeto de classe base

– Chama a funcionalidade da classe base • A funcionalidade invocada depende do tipo do ponteiro ou

referência (handle) usado para invocar a função, não do tipo de objeto para o qual o handle aponta

commissionEmployeePtr = &basePlusCommissionEmployee;

// Chama a fç print declarada na classe base

commissionEmployeePtr->print ();

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Uso de Fçs. de Classe Base de Obj’s de Classe Derivada

• Apontar um ponteiro de classe base para um objeto de classe derivada

– Funções virtual

• Permitem que se invoque a funcionalidade do tipo de objeto, ao invés da funcionalidade do tipo de handle

• São fundamentais para implementar comportamento polimórfico

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Primeiro Exemplo de Polimorfismo em C++

3

Primeiro Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Primeiro Exemplo de Polimorfismo em C++

Primeiro Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Primeiro Exemplo de Polimorfismo em C++

Primeiro Exemplo de Polimorfismo em C++

Primeiro Exemplo de Polimorfismo em C++

4

Primeiro Exemplo de Polimorfismo em C++

Primeiro Exemplo de Polimorfismo em C++

Ponteiro de Classe Derivada p/ um Objeto de Classe Base • Apontar um ponteiro de classe derivada para um

objeto de classe base – Faz com que o compilador C++ gere erros

• CommissionEmployee (objeto da classe base) não é um BasePlusCommissionEmployee (objeto da classe derivada)

– Se isso fosse permitido, o programador poderia tentar acessar membros de dados da classe derivada que não existem na classe base

• Por exemplo, ele poderia tentar acessar baseSalary – Como não existe, a modificação dessa área de memória pode

sobrescrever a memória em uso por outros dados

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Segundo Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Segundo Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Uso de Fçs. de Cl. Derivada via Ponteiros de Cl. Base

• Apontando um ponteiro de classe base para um objeto de classe derivada – Chamar funções existentes na classe base faz com que

a funcionalidade da classe base seja invocada

– Chamar funções não existentes na classe base (mas que podem existir na classe derivada) provocará erros

• Os membros da classe derivada não podem ser acessados por meio de ponteiros de classe base

• Entretanto, podem ser executados por meio de downcasting

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

5

Terceiro Exemplo de Polimorfismo em C++

Terceiro Exemplo de Polimorfismo em C++

Exemplo 1

• Escreva um programa que invoque o método move comum em três classes derivadas da classe Animal e imprima uma mensagem. Para isso, crie uma classe Aguia, Cavalo e Tubarao. A função principal terá um array de ponteiros para objetos da classe Animal cujos elementos serão endereços de objetos das classes derivadas.

? POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

6

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

E se a gente criar um ponteiro para um objeto da classe Cavalo que recebe o conteúdo do array na posição 0?

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

Funciona?

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 1

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

7

Uso de Fçs. de Cl. Derivada via Ponteiros de Cl. Base

• Se o endereço de um objeto de classe derivada foi atribuído a um ponteiro de uma de suas classes base diretas ou indiretas, é aceitável fazer coerção desse ponteiro de classe base de volta para um ponteiro de classe derivada – Na verdade, isso deve ser feito para enviar a esse

objeto de classe derivada mensagens que não aparecem na classe base

• Mas para isso a classe base deve ser POLIMÓRFICA!

Como criar classes polimórficas?

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Funções Virtuais

• Qual função da classe deve ser invocada? – Normalmente

• O handle determina a funcionalidade da classe a ser invocada

– Com funções virtual

• O tipo do objeto para o qual está se apontando, não o tipo do handle, determina que versão da função virtual deve ser invocada

• Programa determina dinamicamente (em tempo de execução, e não em tempo de compilação) que função deve ser usada

– Procedimento conhecido por vinculação dinâmica ou vinculação tardia (late binding)

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Funções Virtuais

• São declaradas colocando-se antes do protótipo de função a palavra-chave virtual na classe base

• As classes derivadas sobrescrevem uma função virtual quando apropriado

• Depois que é declarada virtual... – A função permanece virtual em todos os níveis

inferiores da hierarquia

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Funções Virtuais

• Vinculação estática – Ao chamar uma função virtual usando um objeto

específico com o operador ponto, a invocação da função é resolvida em tempo de compilação

• Vinculação dinâmica – A vinculação dinâmica ocorre somente com os handles

de ponteiro e de referência

CommissionEmployee c; //Classe derivada

c.print ();

CommissionEmployee ce; //Classe derivada

Employee *c = &ce;

c->print ();

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Funções Virtuais

• Uma vez que uma função é declarada virtual, permanece virtual por toda a hierarquia de herança a partir desse ponto – Mesmo que essa função não seja declarada

explicitamente como virtual quando uma classe a sobrescreve

• Mesmo que uma função seja implicitamente virtual por causa de uma declaração feita em um ponto mais alto da hierarquia de classes – Declare explicitamente essa função virtual em cada

nível da hierarquia para deixar o programa mais claro

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Funções Virtuais

• Quando uma classe derivada escolhe não sobrescrever uma função virtual de sua classe base...

– A classe derivada simplesmente herda a implementação de função virtual de sua classe base

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

8

c Quarto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quarto Exemplo de Polimorfismo em C++

Quarto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quarto Exemplo de Polimorfismo em C++

Quarto Exemplo de Polimorfismo em C++

9

Quarto Exemplo de Polimorfismo em C++

Quarto Exemplo de Polimorfismo em C++

Quarto Exemplo de Polimorfismo em C++

Atribuições entre Obj’s de Cl. Base/Derivada e Ponteiros • Quatro maneiras de apontar ponteiros de classe base

e classe derivada para objetos de classe base e classe derivada

– Apontar um ponteiro de classe base para um objeto de classe base

• É um processo direto

– Apontar um ponteiro de classe derivada para um objeto de classe derivada

• É um processo direto

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Atribuições entre Obj’s de Cl. Base/Derivada e Ponteiros • Quatro maneiras de apontar ponteiros de classe base

e classe derivada para objetos de classe base e classe derivada – Apontar um ponteiro de classe base para um objeto de

classe derivada • É seguro, mas pode ser usado para invocar apenas

funções-membro que a classe base declara (a menos que seja utilizado downcasting)

• Permite polimorfismo com funções virtual

– Apontar um ponteiro de classe derivada para um objeto de classe base

• Gera um erro de compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Atribuições entre Obj’s de Cl. Base/Derivada e Ponteiros • É um erro de compilação...

– Depois de apontar um ponteiro de classe base para um objeto de classe derivada, tentar referenciar membros exclusivos de classe derivada com o ponteiro da classe base

• Tratar um objeto de classe base como um objeto de classe derivada pode causar erros

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

10

Classes Abstratas e Funções Virtual Puras

• Classes abstratas

– Classes das quais o programador não pretende instanciar objetos

• São incompletas – As classes derivadas têm que definir as “partes ausentes”

• São muito genéricas para definir objetos

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Classes Abstratas e Funções Virtual Puras

• Classes abstratas

– São normalmente usadas como classes base, denominadas classes base abstratas

• Oferecem uma classe base apropriada da qual outras classes podem herdar

• As classes usadas para instanciar objetos são denominadas classes concretas

– Devem fornecer implementação a toda função-membro da classe, inclusive as incompletas herdadas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Classes Abstratas e Funções Virtual Puras

• Função virtual pura

– Para tornar uma classe abstrata, é necessário declarar “pura” uma ou mais de suas funções virtual

• Colocando “= 0” em sua declaração – Ex.: virtual void draw() const = 0;

» “= 0” é conhecido como um especificador puro

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Classes Abstratas e Funções Virtual Puras

• Função virtual pura

– Não fornece implementações • Toda classe derivada concreta deve sobrescrever todas

as funções virtual puras de classe base com implementações concretas

– Se não sobrescrever, a classe derivada também será abstrata

– É usada enquanto ainda não fizer sentido para a classe base ter a implementação da função

• O programador quer que todas as classes derivadas concretas implementem essa função para o seu caso específico

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Classes Abstratas e Funções Virtual Puras

• Uma classe abstrata define uma interface pública comum para as várias classes em uma hierarquia de classes – Uma classe abstrata contém uma ou mais funções virtual puras que as classes derivadas concretas devem sobrescrever

• Tentar instanciar um objeto de uma classe abstrata causa um erro de compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Classes Abstratas e Funções Virtual Puras

• A falha em sobrescrever uma função virtual pura em uma classe derivada e então tentar instanciar objetos dessa classe é um erro de compilação

• Uma classe abstrata tem pelo menos uma função virtual pura

– Uma classe abstrata também pode ter membros de dados e funções concretas (incluindo construtores e destrutores), que estão sujeitos às regras normais de herança por classes derivadas

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

11

Classes Abstratas e Funções Virtual Puras

• Podemos usar uma classe base abstrata para declarar ponteiros e referências

– É possível fazer referência a todos os objetos de qualquer classe concreta derivada da classe abstrata

– Os programas normalmente usam esses ponteiros e referências para manipular objetos de classes derivadas polimorficamente

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Derivada d; //Obj. da classe derivada

Base *b = &d; //Ponteiro da classe base

Sistema de Folha de Pagamento com Polimorfismo

• Aperfeiçoe a hierarquia CommissionEmployee-BasePlusCommissionEmployee usando uma classe base abstrata

– A classe abstrata Employee representa o conceito geral de um empregado

• Declara a “interface” à hierarquia • Todo empregado tem nome, sobrenome e um número de

seguro social

– Os rendimentos são calculados diferentemente e os objetos são impressos diferentemente para cada classe derivada

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Criação da Classe Base Abstrata Employee

• Classe Employee

– Oferece várias funções get e set

– Oferece as funções earnings e print • A função earnings depende do tipo de empregado, de

modo que é declarada virtual pura – Não há informações suficientes na classe Employee para

uma implementação-padrão

• A função print é virtual, mas não virtual pura – A implementação-padrão é fornecida em Employee

– O exemplo mantém um vector de ponteiros Employee • As funções earnings e print apropriadas são invocadas

polimorficamente

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

c

c Criação da Classe Derivada

Concreta SalariedEmployee • SalariedEmployee herda de Employee

– Inclui um salário semanal • A função earnings sobrescrita incorpora o salário

semanal

• A função print sobrescrita incorpora o salário semanal

– É uma classe concreta • Implementa todas as funções virtual puras da classe

base abstrata

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

12

Quinto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

Criação da Classe Derivada Concreta HourlyEmployee

• HourlyEmployee herda de Employee

– Inclui salário-hora e as horas trabalhadas • A função earnings sobrescrita incorpora os salários

multiplicados pelas horas (leva em conta o pagamento de 50% a mais)

• A função print sobrescrita incorpora o salário e as horas trabalhadas

– É uma classe concreta • Implementa todas as funções virtual puras na classe

base abstrata

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

Quinto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

13

Classe Derivada Concreta CommissionEmployee

• CommissionEmployee herda de Employee

– Inclui vendas brutas e taxa de comissão • A função earnings sobrescrita incorpora as vendas

brutas e a taxa de comissão

• A função print sobrescrita incorpora as vendas brutas e a taxa de comissão

– Classe concreta • Implementa todas as funções virtual puras na classe

base abstrata

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

c Cl. Derivada Concreta Indireta BasePlusCommissionEmployee

• BasePlusCommissionEmployee herda de CommissionEmployee

– Inclui o salário-base • A função earnings sobrescrita incorpora o salário-base

• A função print sobrescrita incorpora o salário-base

– Classe concreta, porque a classe derivada é concreta • Não é necessário sobrescrever earnings para torná-la

concreta. É possível herdar a implementação de CommissionEmployee

– Embora sobrescrevamos earnings para incorporar o salário-base

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

Quinto Exemplo de Polimorfismo em C++

14

Demonstração do Processo Polimórfico

• Crie objetos do tipo SalariedEmployee, HourlyEmployee, CommissionEmployee e BasePlusCommissionEmployee

– Demonstre a manipulação de objetos com a vinculação estática

• Usando handles de nome em vez de ponteiros ou referências

• O compilador pode identificar cada tipo de objeto para determinar que função print e earnings deve chamar

– Demonstre a manipulação de objetos polimorficamente • Use um vector de ponteiros Employee • Invoque funções virtual usando ponteiros e referências

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

c

c Quinto Exemplo de

Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Quinto Exemplo de Polimorfismo em C++

Quinto Exemplo de Polimorfismo em C++

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

15

Estudo de Caso: Sistema de Folha de Pagamento

• Sistema de Folha de Pagamento utilizando polimorfismo e informações de tipo em tempo de execução com downcasting, dynamic_cast, typeid e type_info – Ex.: Recompense BasePlusCommissionEmployees

adicionando 10% a seus salários-base

• É necessário usar informações de tipo em tempo de execução e coerção dinâmica para “programar no específico” – Alguns compiladores exigem que essas informações

sejam habilitadas para serem utilizadas no programa • Consulte a documentação do compilador

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Estudo de Caso: Sistema de Folha de Pagamento

• Operador dynamic_cast – Operação downcast

• Converte um ponteiro de classe base em um ponteiro de classe derivada

– Se um objeto subjacente for do tipo derivado, será executada a coerção

• Do contrário, será atribuído 0

– Se dynamic_cast não for utilizado e houver a tentativa de atribuir um ponteiro de classe base a um ponteiro de classe derivada

• Ocorrerá um erro de compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Estudo de Caso: Sistema de Folha de Pagamento

• Operador typeid

– Recebe um ponteiro desreferenciado e

– Retorna uma referência a um objeto da classe type_info

• Contém informações sobre o tipo de seu operando

• Função-membro name ()

– Retorna uma string baseada em ponteiro que contém o nome do tipo do argumento passado para typeid

– Deve incluir o arquivo de cabeçalho <typeinfo>

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Sexto Exemplo de Polimorfismo em C++

Sexto Exemplo de Polimorfismo em C++

16

Destrutores Virtuais

• Destrutores não virtuais

– Destrutores que não são declarados com a palavra-chave virtual

– Se um objeto de classe derivada for destruído explicitamente atribuindo o operador delete a um ponteiro de classe base para o objeto, o comportamento será indefinido

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Destrutores Virtuais

• Destrutores virtual – São declarados com a palavra-chave virtual

• Todos os destrutores de classe base são virtual

– Se um objeto de classe derivada for destruído explicitamente aplicando o operador delete a um ponteiro de classe base para um objeto, o destrutor de classe derivada apropriado será chamado

• Destrutores de classe base apropriados executarão posteriormente

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Destrutores Virtuais

• Se uma classe tiver funções virtual, forneça um destrutor virtual, mesmo que ele não seja requerido para a classe – As classes derivadas dessa classe podem conter

destrutores que devem ser chamados adequadamente

• Os construtores não podem ser virtual – Declarar um construtor virtual é um erro de

compilação

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

• Escreva um programa que implemente a classe EmployeeCadastro que herda atributos e métodos das classes Cadastro e Senha. Implemente também a classe ClientCadastro que herda somente atributos e métodos da classe Cadastro. Todas as classes devem implementar um método virtual print que para imprimir os valores de todos os seus atributos. A função principal deve instanciar dinamicamente ponteiros da classe base Cadastro para objetos de cada uma das classes derivadas.

? POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

17

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

18

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Exemplo 2

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista

Leitura Recomendada

• Capítulos 13 do livro – Deitel, “C++ How to Program”, 5th edition, Editora

Prentice Hall, 2005

POO para Redes de Computadores - COPPE-PEE/UFRJ Prof. Miguel Campista