Teoria

E aí pessoal! Aqui é o Juan do Responde Aí, e hoje vamos falar de herança.

Herança: criando classes com base em outras classes...

Imagine a seguinte situação. Você está fazendo um programa para organizar os funcionários de uma grande empresa. Porém, são muitos funcionários, e cada cargo requisita detalhes específicos, então você resolveu criar uma classe para cada cargo: Engenheiro, Vendedor, Gerente, etc.

A gente pode fazer um esquema simples com os atributos e métodos de cada classe:

Olhe pro esquema, e observe que os mesmos atributos básicos n o m e , s a l a r i o e s e t o r e o método r e c e b e r _ s a l a r i o (   ) estão repetidos em todas as classes. E se a gente quiser criar uma nova classe pra um novo cargo? Então teríamos que escrever tudo novamente na nova classe!

Então, como podemos fazer melhor? A gente pode usar herança: uma técnica que permite usar uma classe como base para a criação de novas classes. A nova classe é chamada de classe filha (ou de classe derivada) e a classe base é chamada de classe mãe (ou de classe-base). A classe filha vai possuir todos os métodos e atributos existentes na classe mãe.

Voltando pro nosso exemplo, a gente pode criar a classe mãe F u n c i o n a r i o que vai possuir os atributos n o m e , s a l a r i o , s e t o r e o método r e c e b e r _ s a l a r i o (   ) . E depois, a gente usa herança para criar as classes filha E n g e n h e i r o , V e n d e d o r e G e r e n t e , e automaticamente as classes filhas vão possuir os atributos e métodos da classe mãe.

Assim, nós só precisamos escrever a função r e c e b e r _ s a l a r i o uma vez, e ela será válida em todas as classes derivadas. E se algum dia esse método precisar ser alterado, então é só modificar o método dentro da classe F u n c i o n a r i o e automaticamente todas as outras classes serão modificadas também.

E se a política de salários da empresa mudar? E se for necessário um novo atributo para armazenar o número do contrato de cada funcionário? Então é só ir na classe mãe e adicionar esse atributo, e logo todas as classes filhas serão atualizadas!

Executando herança com C++

Mas como a gente usa esse troço no C++? Para efetuar uma herança a gente declara a classe filha, utiliza o operador dois-pontos : e escreve p u b l i c seguido do nome da classe mãe:

c l a s s   N o m e C l a s s e F i l h a   :   p u b l i c   N o m e C l a s s e M a e

Agora é só escrever o código da classe filha, aproveitando os métodos e atributos que já foram escritos na classe mãe!

Exemplo: Vamos fazer o exemplo da classe mãe chamada F u n c i o n á r i o . Essa classe deve ter os atributos n o m e , s a l a r i o e s e t o r e o método r e c e b e _ s a l a r i o (   ) . Por simplicidade, vamos declarar todos os métodos e atributos como públicos.

Belezinha! A classe mãe está pronta. Então vamos escrever uma classe filha que vai representar o cargo de engenheiro. Então declaramos a classe filha usando o operador dois pontos, e informando a classe mãe:

Prontinho! Temos uma classe E n g e n h e i r o que é derivada da classe base F u n c i o n a r i o ! E agora a gente pode escrever um código para classe E n g e n h e i r o utilizando os atributos e métodos que foram declarados na classe base.

Vamos criar um atributo exclusivo dos engenheiros o n u m _ c r e a e um método exclusivo e m i t e _ A R T (   ) . E olha que legal, dentro do método e m i t e _ A R T (   ) a gente pode usar os atributos herdados n o m e e s e t o r sem nenhum problema.

Pra testar, vamos criar um objeto da classe engenheiro, linha 24. Veja como a gente consegue acessar e usar todos os atributos e métodos herdados sem problema algum.

Viu só! Herança é super útil, e nem é assim tão difícil. Então vou te passar um desafio, tenta fazer o código das classes V e n d e d o r e G e r e n t e usando a classe F u n c i o n a r i o como base!

Construtores em classes com Herança

No exemplo anterior a gente inicializou os atributos um de cada vez, mas normalmente, a gente cria construtores para instanciar objetos. E quando tratamos de herança as classes filhas herdam os construtores e destrutores da classe mãe.

Porém, a gente precisa informar que queremos usar o construtor da classe mãe. No momento de criar o construtor da classe filha a gente adiciona o operador dois pontos : e executa o construtor da classe mãe

C l a s s e F i l h a ( t i p o s   p a r a m e t r o s )   : C l a s s e M a e (   p a r a m e t r o s   )

Uma boa prática é que a classe filha sempre chame o construtor da classe mãe.

Exemplo: Então vamos voltar pro nosso exemplo. Dentro da classe mãe F u n c i o n a r i o s vamos adicionar um construtor, que receberá os valores de inicialização dos atributos da classe. Ah, lembre-se que um construtor é uma função sem tipo com o mesmo nome da classe.

E agora vamos pra classe filha E n g e n h e i r o possui os métodos e atributos herdados, e já adicionamos o atributo n u m _ c r e a e o método e m i t e _ A R T (   ) . Na linha 28 adicionamos o construtor da classe E n g e n h e i r o , e em seguida, a gente usa o operador dois pontos : e executa o construtor da classe mãe que inicializa os atributos n o m e , s a l a r i o e s e t o r . E na linha 29, dentro do construtor da classe filha, a gente inicializa o atributo exclusivo n u m _ c r e a

Agora podemos executar essa classe dentro da m a i n ( ) . Iniciamos um objeto informando os dados diretamente no construtor, linha 34, e podemos executar seus métodos, linha 36 e 37.

Destrutores em classes com Herança

O caso do destrutor é mais simples. Quando o destruidor da classe filha é acionado, automaticamente o da classe mãe também é. E é só isso. Na maioria das vezes, nem é necessário criar um destrutor. E se for preciso, basta você criar o destrutor direitinho e pronto.

Membros públicos, privados e protegidos.

No exemplo anterior todos os métodos e atributos da classe mãe eram públicos. Então o que acontece com os membros privados durante uma herança?

A resposta é: As classes filhas não têm acesso direto aos membros privados da classe mãe. Porém, é possível acessar os membros privados através de métodos públicos (por exemplo, através do construtor herdado ou de métodos setters e getters públicos)

Uma outra solução é usar membros protegidos p r o t e c t e d . Eles são um intermediário entre os membros públicos e privados. Os membros protegidos impedem o uso de um membro fora da classe, porém, permite que a classe filha acesse os membros protegidos.

Exemplo: Vamos mais uma vez ao exemplo da classe F u n c i o n a r i o s , reescrevendo o código, efetuando o encapsulamento dos atributos e métodos como públicos, privados e protegidos.

Os atributos n o m e , s a l a r i o e s e t o r são informações importantes e não podem ser públicas, porém devem ser de fácil acesso da classe filha, e por isso podem ter sua visibilidade protegida, linhas 08 a 10. E por último, vamos manter públicos o método r e c e b e _ s a l a r i o e o construtor, para poder ser usados ao longo da m a i n (   )

Na classe filha E n g e n h e i r o , temos o atributo n u m _ c r e a que é uma informação crucial para qualquer engenheiro, então ela deve ser privada.

Já o método e m i t e _ A R T (   ) faz parte do dia-a-dia de trabalho, e por isso será pública. Observe que esse método utiliza os atributos herdados n o m e e s e t o r , mas esses atributos são protegidos, então podemos acessá-los a partir da classe filha sem problemas!

E pronto. As nossas classes agora estão devidamente encapsuladas!

Resumo

Herança é uma técnica que permite usar uma classe como base para a criação de uma nova classe. Permite classes melhor elaboradas, deixa o código mais limpo e fácil de ler, e evita que você precise escrever o mesmo código várias vezes para classes diferentes.

Para efetuar uma herança a gente declara a classe filha utilizando o operador dois-pontos : e escreve p u b l i c seguido do nome da classe mãe:

c l a s s   N o m e C l a s s e F i l h a   :   p u b l i c   N o m e C l a s s e M a e

É possível utilizar o construtor da classe filha e da classe mãe ao mesmo tempo com a sintaxe:

C l a s s e F i l h a ( t i p o s   p a r a m e t r o s )   : C l a s s e M a e (   p a r a m e t r o s   )

A classe filha vai possuir todos os métodos e atributos existentes na classe mãe, porém, a forma de acesso depende se o membro é privado, protegido ou público.

E é isso! Você agora você precisa praticar com exercícios de fixação para ficar craque no uso de herança.

Executando herança com C++

Construtores em classes com Herança

Destrutores em classes com Herança

Membros públicos, privados e protegidos.

Resumo

Exercícios Resolvidos

Exercício Resolvido #1

Explique o que é herança em C++ e como pode ser útil.

Passo 1

Em programação orientada a objetos, herança é a capacidade de uma classe servir como base para construção de novas classes. Uma classe base é geralmente chamada de classe mãe, e a nova classe é chamada de classe filha.

A técnica de herança permite que a classe filha utilize todos os métodos e atributos que já foram criados dentro da classe mãe.

Essa é uma técnica muito útil para reutilizar código. Além disso, facilita a programação, pois permite que a gente crie várias classes simples, que herdam códigos uma da outra, ao invés de criar classes complexas.

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #2

Observe a classe M ã e abaixo.

Crie uma classe chamada F i l h a que herda os métodos e atributos de M a e .

Crie um objeto da classe F i l h a , inicialize o atributo herdado e utilize o método herdado.

Passo 1

Vamos nessa, galerinha!

A questão nos mostra uma classe bem simples e pede que a gente crie uma classe derivada que herda todos os métodos e atributos. Ou seja, vamos ter que usar nossos conhecimentos de herança!

Mas pra começar, vamos copiar o código do enunciado pra dentro do nosso código:

Passo 2

Show! É agora que a diversão vai começar.

O que precisamos fazer é criar uma nova classe que herda os atributos e métodos de M a e . Lembre-se, para executar uma herança, é só a gente escrever desse jeito:

c l a s s   N o m e C l a s s e F i l h a   : p u b l i c   N o m e C l a s s e M a e

Então vamos fazer isso no nosso código.

Vamos criar uma nova classe chamada F i l h a e usando o operador : vamos herdar as características da classe M a e .

E é só isso! A questão não pede mais nada. Então não precisamos escrever nenhum código para a classe F i l h a .

Mas preste atenção, apesar de a gente não escrever nada dentro das chaves da classe F i l h a ela não está vazia. Afinal de contas, a gente aplicou uma herança! Então, todos os atributos da classe mãe foram automaticamente copiados para dentro da classe filha!

Passo 3

O último passo é a gente criar e utilizar um objeto da classe filha.

Então vamos iniciar a nossa m a i n (   ) , e vamos usar a classe F i l h a para instanciar objeto f 1 .

Na linha 17 vamos acessar o atributo herdado a t r i b u t o M a e e inicializar com um valor qualquer.

E na linha 18 vamos usar o objeto para acessar o atributo herdado m e t o d o M a e

Rodando esse código teremos o seguinte resultado:

Resposta

Exercício Resolvido #3

Abaixo temos uma classe P e s s o a com atributos básicos n o m e e d i n h e i r o , e o método básico t r a b a l h a r (   ) que adiciona mais 100 no atributo d i n h e i r o .

Crie uma classe filha chamada C o n s u m i d o r e adicione um método c o m p r a r (   ) que recebe o valor de uma compra e altera a quantidade de dinheiro do consumidor, e um atributo que contabiliza quantos itens esse consumidor comprou

Instancie um objeto da classe C o n s u m i d o r , preencha todos os seus atributos e utilize o método t r a b a l h a r (   ) e o método c o m p r a r (   ) , e imprima a quantidade de dinheiro que o cliente ficou no final.

Passo 1

E aí, pessoal, beleza?!

O objetivo dessa questão é que a gente crie uma classe filha que herda os métodos e atributos da classe pessoa, e depois crie nosso próprio método. Então, vamos ter que usar nossos conhecimentos de herança!

Uma vantagem é que a questão já deu a classe mãe prontinha pra gente! Então, a primeira coisa que vamos fazer é escrever o código da questão dentro do nosso código. Ah, um detalhe é que a classe usa strings. Então já vamos adicionar o cabeçalho < s t r i n g > também.

Passo 2

Ok. Agora sim a gente vai começar a diversão. Como a classe base já está feita, então vamos nos preocupar em criar a classe derivada.

Lembre-se que pra criar uma classe filha usamos a seguinte sintaxe:

c l a s s   N o m e C l a s s e F i l h a   : p u b l i c   N o m e C l a s s e M a e

Então vamos criar a nossa classe C o n s u m i d o r , e usando o   : p u b l i c indicamos que vamos herdar a classe P e s s o a

Massa! Agora todos os métodos e atributos da classe P e s s o a fazem parte da classe C o n s u m i d o r também.

Passo 3

Certo, com a herança efetuada, agora podemos expandir a classe filha. Então vamos adicionar métodos e atributos novos dentro da classe C o n s u m i d o r . Por simplicidade, vamos fazer tudo público.

Primeiro vamos adicionar um atributo chamado n u m C o m p r a s que vai contabilizar a quantidade de compras feitas por um consumidor.

E em seguida, vamos adicionar o método c o m p r a r (   ) , que recebe como parâmetro o valor gasto, e executa uma redução no dinheiro do consumidor e incrementa a contagem de compras.

Lembre-se que o atributo d i n h e i r o é um atributo público da classe mãe, e graças a herança a gente pode usar esse atributo sem problemas.

E isso finaliza a classe filha.

Passo 4

Pra fechar a questão, vamos utilizar a classe que a gente criou.

Iniciamos a m a i n (   ) e dentro dela vamos instanciar um objeto da classe C o n s u m i d o r chamado c o n s 1

E em seguida inicializamos todos os atributos. Os atributos n o m e e d i n h e i r o foram herdados da classe mãe. O atributo n u m C o m p r a s pertence à classe filha e também é público. Todos eles são atributos públicos, então podemos acessá-los através do objeto.

Em seguida vamos executar cada um dos métodos. Primeiro vamos trabalhar e depois vamos executar uma compra. O método t r a b a l h a r foi herdado da classe mãe, esse é um método público que pode ser usado pela classe filha de qualquer lugar. Já o método c o m p r a r (   ) pertence à classe filha e é público, e por isso também pode ser usado em qualquer lugar.

E só pra finalizar, vamos imprimir uma mensagem que diz o nome e a quantidade de dinheiro do consumidor.

O resultado é:

Resposta

Exercício Resolvido #4

Abaixo temos uma classe P e s s o a com atributos básicos n o m e e d i n h e i r o , e o método básico t r a b a l h a r (   ) que adiciona mais 100 no atributo d i n h e i r o . E a classe filha C o n s u m i d o r que herda a classe pessoa e adiciona o atributo n u m C o m p r a s que contabiliza quantos itens esse consumidor comprou e o método c o m p r a r (   ) que recebe o valor de uma compra e altera a quantidade de dinheiro do consumidor.

As boas práticas de programação dizem que os membros de uma classe devem ser encapsulados como p r i v a t e , p r o t e c t e d ou p u b l i c de acordo com suas características de importância, segurança e nível de acesso.

Modifique as classes para que seus membros estejam devidamente encapsulados como p r i v a t e , p r o t e c t e d ou p u b l i c . Se necessário modifique ou crie métodos.

Passo 1

E aí, pessoal.

A questão já entregou as classes feitas pra gente. O que ela quer é que a gente remodele as classes para que elas fiquem encapsuladas corretamente.

Então, vamos lembrar qual é a função de cada nível de acesso:

  • p u b l i c : Os membros públicos de uma classe podem ser acessados de qualquer lugar.
  • p r i v a t e s : os membros privados só podem ser acessados dentro da própria classe.
  • p r o t e c t e d : os membros protegidos podem ser acessados dentro da própria classe ou de uma classe filha.

Pra resolver essa questão temos que analisar cada membro das classes e decidir qual o nível de acesso adequado. E se necessário, a gente vai ter que criar métodos setters e getters.

Mas antes, vamos escrever o cabeçalho do programa. Vamos precisar incluir a biblioteca < s t r i n g >

Passo 2

Vamos dar uma olhada na classe P e s s o a e vamos definir o nível de acesso de cada membro.

Vamos começar com o atributo n o m e , essa é uma informação cadastral que não deve ser modificada facilmente, por isso não pode ser público, além disso o atributo não precisa ser acessado na classe filha, então pode ser um atributo privado:

Quanto ao atributo d i n h e i r o gente não pode permitir que uma pessoa altere seu dinheiro sem trabalhar, ou seja, não pode ser um atributo público. Contudo, esse atributo precisa ser acessado em um método da classe filha, então não pode ser privado. A solução é definir esse atributo como protegido.

O método t r a b a l h a r   tem que ficar disponível sempre que a pessoa quiser ganhar dinheiro. Então vamos mantê-lo público.

Da forma que está, os atributos n o m e e d i n h e i r o não serão acessados através de um objeto. Então vamos criar métodos setters e getters para permitir que a gente trabalhe com esses atributos:

Passo 3

Vamos seguir para a classe C o n s u m i d o r . Primeiro de tudo, ela é uma classe herdeira. Então na primeira linha devemos herdar a classe P e s s o a

O atributo n u m C o m p r a s será de uso interno da classe, então não tem necessidade de ser público, vamos colocá-lo como privado:

O método c o m p r a r (   ) deve ser de acesso livre, pois assim o consumidor pode efetuar compras com facilidade.

Antes de concluir a classe, nós precisamos de uma forma de inicializar o atributo n u m C o m p r a s . Então vamos criar um método setter

E prontinho! A classe está devidamente modificada. 😊

Resposta

Exercício Resolvido #5

A classe base P e s s o a é herdada pela classe filha C o n s u m i d o r .

Crie um construtor para as duas classes, para quando um objeto da classe filha for criado, automaticamente invoque o construtor da classe mãe.

Se necessário crie ou modique os métodos.

Passo 1

Hey, ho, lets go!

Essa questão entregou pra gente uma classe base e uma classe filha, e quer que a gente crie um construtor para as duas classes.

Perceba que a classe C o n s u m i d o r é herdeira da classe P e s s o a , então temos que levar isso em conta na hora de escrever o construtor da classe filha.

Mas por enquanto, vamos apenas escrever o cabeçalho do código.

Passo 2

Vamos começar pela classe mãe P e s s o a . Primeiro, vamos escrever o que já foi dado pra gente na questão.

E agora vamos desenvolver o método construtor. Lembre-se que um construtor é uma função sem tipo com mesmo nome da classe.

Dentro do construtor vamos inicializar os atributos n o m e e d i n h e i r o .

E é basicamente isso, apenas um construtor simples, sem nada demais.

Antes de fechar essa classe, vamos criar dois atributos getters para que a gente possa visualizar o atributo privado n o m e e o atributo protegido d i n h e i r o

Passo 3

Agora vamos pra classe filha C o n s u m i d o r . Essa classe herda todos os atributos e métodos da classe P e s s o a .

Vamos começar copiando o código do enunciado no nosso programa:

Agora vamos desenvolver o construtor. Pra desenvolver um construtor em uma classe derivada vamos usar a seguinte forma:

n o m e C l a s s e F i l h a   t i p o s   p a r a m e t r o s     : n o m e C l a s s e M a e (   p a r a m e t r o s   )

No lado esquerdo da expressão acima temos o construtor da classe filha que recebe todos os parâmetros necessários para inicializar os atributos, e do lado direito a gente executa o construtor da classe mãe entregando os parâmetros necessários. E depois a gente escreve o código do construtor para inicializar os atributos restantes.

Vamos ver no código. Na primeira parte da linha 33 temos o construtor da classe C o n s u m i d o r recebendo os três valores necessários n o m e , d i n h e i r o e n u m C o m p r a s .

Ainda na linha 33 nós executamos o construtor da classe P e s s o a e passamos os parâmetros n o m e e d i n h e i r o . Dessa forma o construtor da classe mãe é executado e os atributos n o m e e d i n h e i r o são inicializados.

Mas o atributo n u m C o m p r a s ainda não foi inicializado. Então dentro das chaves do construtor da classe filha vamos inicializar o atributo n u m C o m p r a s .

E prontinho. O construtor da classe filha está feito!

Resposta

Ei, a resposta está no passo a passo :)

Exercício Resolvido #6

Faça um programa que representa formas geométricas utilizando herança simples, seguindo o modelo proposto.

Se necessário, crie novos métodos para facilitar o código.

Crie um programa que instancie objetos das duas classes.

Passo 1

E aí, galera!

Essa é uma questão de herança. O diagrama mostra que temos a classe mãe F o r m a e a classe filha Q u a d r i l a t e r o .

A melhor forma de resolver exercícios de herança é desenvolver primeiro a classe mãe, e posteriormente a classe filha.

A classe F o r m a possui três atributos privados, a string n o m e , e os inteiros p o s X e p o s Y que representam a posição da forma. Já a classe Q u a d r i l a t e r o possui todos os atributos e métodos herdados da classe mãe além de possuir mais dois atributos inteiros l a r g u r a e c o m p r i m e n t o e mais dois métodos p e r i m e t r o (   ) e a r e a (   )

Depois de crias das duas classes, vamos precisar instanciar um objeto de cada classe para testar o nosso código. Então vamos precisar de métodos extras para acessar os atributos privados e protegidos a partir da m a i n ( )

Mas antes, vamos escrever o cabeçalho. Como temos um atributo do tipo string então será necessário o incluir a biblioteca < s t r i n g >

Passo 2

Beleza, então vamos construir a classe F o r m a .

A classe F o r m a possui três atributos protegidos, a string n o m e e os inteiros p o s X e p o s Y . Então usaremos a palavra chave p r o t e c t e d para encapsular esses atributos corretamente.

O esquema de classe proposto no enunciado da questão termina aqui. Porém, para acessar esses atributos protegidos através de um objeto a gente vai precisar criar métodos públicos.

O primeiro vai ser o s e t F o r m a (   ) que vamos usar para inicializar os três atributos protegidos. Então essa função recebe como parâmetro os valores dos três atributos, e em seguida inicializa os atributos:

E também vamos criar uma função p r i n t F o r m a (   ) que não recebe nenhum atributo, e apenas exibe um texto que fala o nome e posição da forma:

Show! Classe mãe pronta!

Passo 3

Beleza! Com a classe mãe concluída podemos desenvolver a classe filha.

Pra começar, vamos declarar a classe Q u a d r i l a t e r o e informar que queremos herdar a classe F o r m a . Fazemos isso assim:

c l a s s   N o m e F i l h a : p u b l i c   N o m e M a e

No código:

E prontinho! Agora a classe filha possui todos os métodos e atributos da classe mãe.

Vamos desenvolver agora os detalhes exclusivos da classe filha. Primeiro, ela possui dois atributos privados: l a r g u r a e c o m p r i m e n t o

Belezinha. A classe também possui dois métodos públicos. O primeiro é um método que retorna inteiros que calcula o perímetro.

E um segundo método chamado a r e a   que retorna inteiros e calcula a área do quadrilátero:

Show. Mas a gente não tem nenhuma forma de preencher os atributos privados. Então vamos criar o método s e t Q u a d r i l a t e r o que inicializa os atributos o c o m p r i m e n t o e l a r g u r a .

E agora sim, a classe está pronta.

Passo 4

Agora vamos testar as classes. Primeiro vamos instanciar um objeto de cada classe.

Para o objeto f o r m a vamos utilizar o método s e t F o r m a (   ) para iniciar os atributos, e em seguida vamos imprimir o conteúdo com o método p r i n t F o r m a (   )

Já no objeto q u a d r a d o nós temos acesso aos atributos e métodos da classe mãe e também aos atributos e métodos exclusivos da classe filha.

Então podemos começar inicializado o objeto q u a d r a d o . Primeiro usando o método herdado s e t F o r m a e em seguida utilizando o método s e t Q u a d r i l a t e r o

E depois, podemos utilizar o método herdado p r i n t F o r m a para exibir informações sobre o q u a d r a d o e depois podemos usar os métodos p e r i m e t r o (   ) e a r e a (   ) :

E teremos o seguinte resultado

E prontinho! Questão concluída.

Resposta

Exercício Resolvido #7

Implemente as classes abaixo:

Passo 1

E aí, beleza?!

Essa questão mostra pra gente um esquema que contém três classe: A n i m a l , C a c h o r r o e G a t o , mostrando os métodos e atributos de cada classe. E o mais interessante, é que mostra que as classes C a c h o r r o e G a t o são herdeiras da classe base A n i m a l .

A questão pede pra gente implementar as classes mães e as classes filhas.

Mas vamos começar com o cabeçalho do código. Analisando o esquema, você vai notar que temos os atributos n o m e e r a c a que são do tipo string. Então vamos precisar incluir o cabeçalho < s t r i n g >

Passo 2

Vamos começar implementando a classe mãe A n i m a l

Dando uma olhada no esqueminha fornecido na questão, a gente possui dois atributos públicos do tipo string n o m e e r a c a . Vamos implementar

Também temos métodos publicos, um construtor sobrecarregado e o método c a m i n h a ( ) . Quando o construtor não recebe parâmetros os dois atributos são iniciados com strings vazias. Quando o construtor recebe um parâmetro, o valor do atributo nome é preenchido.

Acontece que construtores sobrecarregados não funcionam muito bem com herança. Porém, podemos usar um construtor com valor padrão e terá o mesmo efeito. Lembre-se, o construtor é um método sem tipo com o mesmo nome da classe. Para fazer um construtor com parâmetro padronizado, é só usar o operador = após os parâmetros na declaração do método.

N o m e C l a s s e ( t i p o   p a r a m _ 1 = v a l o r P a d r a o 1 ,   … , t i p o   p a r a m _ N = v a l o r P a d r a o N )

No nosso código, o construtor terá apenas um único parâmetro:

Por fim, a gente tem de implementar o método c a m i n h a ( ) esse método não recebe e nem retorna nada, então deve ser do tipo v o i d com parêntesis vazios. Esse método vai imprimir uma mensagem que informa o nome do animal e que ele está caminhando

Passo 3

Agora vamos pra parte mais legal da questão. Vamos construir uma classe filha chamada C a c h o r r o que herda a classe A n i m a l . Lembre-se, a gente efetua a herança no momento da criação da classe filha assim:

c l a s s   N o m e C l a s s e F i l h a   : p u b l i c   N o m e C l a s s e M a e

No código fica:

A classe mãe possui um construtor. Então vamos criar um construtor na classe filha que utiliza o construtor da classe mãe. Fazemos da seguinte maneira:

N o m e C l a s s e F i l h a   ( t i p o s   p a r a m e t r o s )   : N o m e C l a s s e M a e (   p a r a m e t r o s   )

O ponto crucial é que a classe mãe usa um construtor com valor padronizado. Então o construtor da classe filha também deve ter um valor padronizado:

E olha que legal. Como todos os parâmetros já são iniciados dentro da classe mãe, então o construtor da classe filha pode ficar vazio.

Agora a classe C a c h o r r o foi criada e já possui os atributos e métodos que foram herdados da classe mãe, e já está com o construtor definido. Só falta adicionar o método l a t e (   ) . Esse método não recebe e nem retorna nenhum valor, apenas imprime uma “frase” emitida pelo cachorro:

Passo 4

A segunda classe filha é a classe G a t o que é essencialmente igual à classe C a c h o r r o . Então começamos efetuando a herança no momento da criação da classe G a t o

c l a s s   N o m e C l a s s e F i l h a   : p u b l i c   N o m e C l a s s e M a e

No código fica:

O construtor deve seguir o mesmo padrão do construtor da classe mãe. Então faremos um construtor para a classe G a t o usando parâmetros padronizados:

N o m e C l a s s e F i l h a   ( t i p o s   p a r a m e t r o s = v a l o r e s )   : N o m e C l a s s e M a e (   p a r a m e t r o s   )

De novo, a gente não precisa preencher o construtor, pois todos os atributos já foram preenchidos no construtor da classe mãe.

E pra terminar a classe, vamos desenvolver o método m i a ( ) que imprime um miado:

Resposta

Exercício Resolvido #8

Crie uma classe C i r c u l o que possui a posição do ponto central, raio, métodos para calcula área e perímetro, e com construtor para instanciar um círculo, com e sem parâmetros.

Crie uma classe R o d a que seja derivada da classe Circulo. Esta classe deve representar uma roda de carro, com atributos relevantes para este tipo de objeto: (material, aro, fabricante, ...)

Crie um programa para testar as classes criadas.

Resposta

Ei, a resposta está no passo a passo :)