Prévia do material em texto
Introdução à herança
Apresentação
Quando falamos em herança, logo nos vêm à mente situações intrínsecas no meio em que vivemos
— por exemplo, uma pessoa que deixa seus bens como herança para seus dependentes. Podemos
citar também heranças genéticas: um filho herda a cor de pele, a cor de cabelo e a cor de olhos,
entre outras características, de seus pais biológicos.
Em orientação a objetos não é diferente, a não ser o fato de estarmos lidando com códigos.
Herança, em orientação a objetos, consiste na criação de uma estrutura que contém uma classe raiz
— que também podemos referir como classe pai, mãe, genérica ou superclasse — e classes
especializadas, também chamadas de classes filhas ou subclasses.
Nesta Unidade de Aprendizagem, você vai ver o que é herança e como se pode implementar essa
estrutura.
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir o que é herança em orientação a objetos.•
Julgar quanto à necessidade da criação de uma estrutura de herança.•
Construir estruturas de herança em uma linguagem de programação.•
Desafio
Trabalhar com herança em orientação a objetos pode trazer muitas vantagens, como a economia de
código; entretanto, é importante ter um bom conhecimento sobre o assunto para aplicá-lo da
melhor forma nos projetos.
Imagine o seguinte cenário:
A imagem a seguir possui audiodescrição.
Sua tarefa é implementar as classes de modelo em uma linguagem de programação orientada a
objetos. Além dos requisitos para cadastro de informações e seus respectivos campos, seu gerente
apontou as seguintes recomendações:
• programar utilizando a linguagem de programação Java.
• considerar a possibilidade de criar uma estrutura de herança.
• encaminhar o projeto em formato .zip para validação.
Infográfico
A herança é um mecanismo que entende as classes existentes adicionando novos métodos e
campos no código-fonte. Tanto classes raízes como classes genéricas são implementadas e são
denominadas "classes pai". As classes filhas são as classes mais especializadas. Essa classe herda
métodos e atributos de uma superclasse.
Veja, no Infográfico, conceitos importantes sobre o uso de herança.
A imagem a seguir possui audiodescrição.
Aponte a câmera para o
código e acesse o link do
conteúdo ou clique no
código para acessar.
https://statics-marketplace.plataforma.grupoa.education/sagah/d5fcd28d-ea27-4954-a2b3-69ce3712c751/daea261f-8ea7-4f78-b544-01e952d936c8.png
Conteúdo do Livro
Trabalhar com herança em orientação a objetos pode nos trazer redução significativa de código e,
em consequência, aumento de produtividade. Portanto, o domínio desses conceitos torna-se vital
para o desenvolvimento de softwares.
No capítulo Introdução à herança, base teórica desta Unidade de Aprendizagem, você irá aprender
a identificar a necessidade da criação de uma estrutura de herança e o processo de construção de
uma estrutura de herança em uma linguagem de programação orientada a objetos.
Boa leitura.
Os elementos gráficos deste capítulo possuem audiodescrição. Para acessar o recurso,
clique aqui
https://creator-files.plataforma.grupoa.education/undefined/9111_Audiodescricao_Conteudo_do_livro-2026-04-06T13:28:12-03:00.pdf
LINGUAGEM DE
PROGRAMAÇÃO
Priscila de Fátima Gonçalves
Introdução à
herança em C++
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
� Definir o que é herança em orientação a objetos.
� Identificar a necessidade da criação de uma estrutura de herança.
� Construir estruturas de herança em uma linguagem de programação.
Introdução
Ao estudar herança, você percebe seus conceitos, aprende a realizar
reutilização de código (poupando tempo de desenvolvimento), como
utilizar construtores e funções-membro da classe base, bem como a
diferença entre vinculação estática e dinâmica.
Neste capítulo, você estudará um importante conceito de progra-
mação orientada a objetos. Por meio da utilização da herança você será
capaz de definir classes novas que serão extensões de classes existentes.
Conceito
A herança é um dos principais pontos da programação orientada a objetos,
promovendo a extensibilidade do código, a reutilização e uma maior coerência
lógica no modelo de implementação. Os métodos herdados são usados da
mesma forma que os métodos não herdados, nenhum trecho de código é ne-
cessário para mencionar que os métodos serão herdados, o uso do recurso em
uma classe não requer saber se ele foi ou não herdado, o que gera flexibilidade
para o programador.
Entre as vantagens oferecidas pela herança, podemos citar a manutenção
de bibliotecas, para uso futuro de determinados recursos que sejam utilizados
com frequência.
Segundo Horstmann (2005), a herança é um mecanismo para melhorar classes
existentes, ou seja, se uma classe nova precisa ser implementada e há uma classe
com um conceito geral já disponível, a nova classe poderá herdar da classe existente.
Em C++, uma classe ou estrutura pode ter mais de uma classe base direta
ou estrutura, permitindo especificar se você deseja que uma classe seja uma
classe base simples ou uma classe base virtual. Veja exemplos nas Figuras 1 e 2.
Figura 1. Definição de classe derivada que apresenta o relacionamento entre as classes.
Fonte: Horstmann (2005, p. 386).
Figura 2. Diagrama de herança que apresenta o relacionamento entre as classes.
Fonte: Horstmann (2005, p. 387).
Introdução à herança em C++160
Necessidade da criação de uma estrutura
de herança
Os dados-membro de uma classe base estão presentes em cada objeto de uma
classe derivada. Porém, não podem ser acessados pelas funções-membro
dessa classe. Como se tratam de dados privativos da classe base, somente ela
tem acesso a eles. Isto mostra que a classe derivada não tem mais direitos de
acesso do que qualquer outra classe.
Quando uma classe é instanciada, o construtor é chamado. Dessa forma, se
ela for derivada de outra, o construtor da classe base é chamado antes. Ainda
dentro desse contexto, se a classe base for derivada de outra, o processo se
repetirá de forma recursiva, até que uma classe não derivada seja atingida,
o que se torna essencial para manter a compatibilidade para o objeto criado.
Quando uma classe base não possuir um construtor sem parâmetros, a
classe derivada tem que declarar um construtor, mesmo que ele esteja vazio.
O construtor de uma classe derivada tem duas funções: a primeira refere-se
a inicializar o objeto base; e a segunda, a inicializar todos os dados-membro.
Observe o modelo da Figura 3.
Figura 3. Construtor com inicializador de classe base.
Fonte: Horstmann (2005, p. 392).
161Introdução à herança em C++
Caso seja omitido o construtor de uma classe base, o objeto base será
construído com o construtor default dela. Porém, se a classe base não possuir
um construtor default, você terá que chamar, de forma explícita, um construtor
da classe base no construtor da classe derivada. Se você invocar outra função-
-membro sobre o parâmetro implícito, não precisará especificar o parâmetro,
mas somente escrever o nome da função-membro.
Segundo Horstmann (2005), um dos erros mais frequentes é tentar acessar
campos privativos da classe base. Outro possível erro é que, ao estender a
funcionalidade de uma função da classe base, os programadores se esquecem
do nome da classe. Assim, sempre que se chama uma função de determinada
classe base a partir de uma função do mesmo nome de uma classe derivada,
tenha a certeza de fornecer o nome completo da função, incluindo o nome
da classe base.
Ainda dentro da implementação de herança, você precisa saber que existem
tipos de vinculação de objetos, dinâmica e estática. O tipo estático é o tipo
foi declarado no texto do programa como tipo ponteiro, sem fazer qualquer
diferença para onde está apontando; já o tipo dinâmico é determinado pelo
tipo de objeto ao qual se refere neste momento, sendo assim, indica como ele
se comportará.O tipo dinâmico pode ser modificado à medida que o programa
for sendo executado, normalmente por meio de atribuições.
As funções virtuais são dinamicamente vinculadas, portanto, a função espe-
cífica chamada será determinada pelo tipo dinâmico de objeto, de acordo com
o modo como é chamada. Porém, os parâmetros são vinculados estaticamente,
ou seja, você pode chamar uma função definida em uma classe derivada, mas
deve utilizar um valor padrão de parâmetro da classe base.
Nunca redefina um valor padrão de parâmetros herdados, porque os valores
padrão herdados são estaticamente vinculados, enquanto as funções virtu-
ais – as únicas funções que você deve sobrescrever – são dinamicamente
vinculadas (MEYERS, 2011, p. 203).
“Uma classe derivada herda todos os campos de uma classe base. Porém, se os campos
forem privativos, as funções da classe derivada não possuem direito de acesso a eles”
(HORSTMANN, 2005, p. 396).
Introdução à herança em C++162
Construção de estruturas de herança em
uma linguagem de programação
Quando uma classe herda da outra, membros da classe base são incorporados
como membros da classe derivada. Como as restrições de acessos são geren-
ciadas em classes diferentes, principalmente o acesso aos membros da classe
base a partir das derivadas, você deve aplicar os especificadores de acesso
para obter o controle de acesso à classe base, são eles:
� public;
� private;
� protected.
Herança pública garante que tudo o que se aplica a objetos da classe base,
será aplicado aos objetos da classe derivada, porque cada objeto da classe
derivada é um objeto da classe base. Na classe herdada como public, membros
da classe derivada permanecem como públicos; membros private da classe base
só podem ser acessados por meio de funções públicas ou protegidas da classe
base; e membros protected que estiverem na classe derivada se comportam
na classe derivada como protegidos.
A utilização do atributo protected funciona da mesma forma que o private
sob o ponto de vista interno da classe, a diferença está no fato de que atributos
protected são visíveis pelas classes derivadas, ao passo que os private não.
Essas características podem ser traduzidas por permitir flexibilidade para o
programador.
Na classe herdada como protected, membros public da classe base ficam
como se estivessem protegidos na classe derivada; membros private só podem
ser acessados por funções da classe base que se utilizem das informações que
estão neles; e membros protected se comportam como se fossem copiados
como protegidos na classe derivada.
Na classe herdada como private, membros public agem como se fossem
private na classe derivada, membros private estarão presentes, porém ocultos
como private, só podendo ser acessados por funções da classe base que se utili-
zem das informações que neles contém; já os membros protected comportam-se
como private na classe derivada. Assim, sobressai o atributo mais restritivo.
163Introdução à herança em C++
Em C++ pode ocorrer de uma classe derivada herdar membros de várias
classes base, o que poderá dar ao programador, maior poder de modelagem,
porém necessitará de mais cuidado na sua utilização, em razão do que chama-
mos de heranças múltiplas. Observe no Quadro 1 uma relação entre heranças
e seus acessos permitidos.
Fonte: Adaptado de Aguilar (2008, p. 623).
Tipo de herança
Acesso a membro
classe base
Acesso a membro
classe derivada
Privado Privado
Protegido
Público
Inacessível
Privado
Privado
Protegido Privado
Protegido
Público
Inacessível
Protegido
Protegido
Público Público
Protegido
Público
Público
Protegido
Público
(Omitido) Público
Protegido
Público
Público
Protegido
Público
Quadro 1. Tipos de herança considerados no pseudocódigo e acessos permitidos
Introdução à herança em C++164
Observe a demonstração de herança a seguir.
165Introdução à herança em C++
Introdução à herança em C++166
167Introdução à herança em C++
AGUILAR, L. J. Fundamentos de programação: algoritmos, estruturas de dados e objetos.
Porto Alegre: McGraw-Hill, 2008.
HORSTMANN, C. Conceitos de computação com o essencial de C++. 3. ed. Porto Alegre:
Bookman, 2005.
MEYERS, S. C ++ eficaz: 55 maneiras de aprimorar seus programas e projetos. 3. ed.
Porto Alegre: Bookman, 2011.
Leituras recomendadas
VOTRE, V. P. C++ explicado e aplicado. Rio de Janeiro: Alta Books, 2016.
WIKILIVROS. Programar em C++: herança. 2011. Disponível em: . Acesso em: 23 abr. 2018.
Dica do Professor
A herança é um princípio de programação orientada a objetos que permite que novas classes sejam
criadas a partir de classes criadas anteriormente. Essas novas classes são chamadas de "subclasses"
ou "classes derivadas". As classes existentes que produzem subclasses são chamadas de
"superclasses" ou "classes base".
Na Dica do Professor, você vai ver como os atributos semelhantes fazem parte das classes listadas
entre as classes aluno e professor e compreender como os atributos podem ser analisados,
facilitando a criação de uma estrutura de herança.
As imagens do vídeo a seguir possuem audiodescrição. Para acessar o recurso,
clique aqui
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://creator-files.plataforma.grupoa.education/undefined/9111_Audiodescricao_Dica_do_Professor-2026-04-06T14:36:41-03:00.pdf
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/c209e2d8c5a319d0ad8315cc0c81e94b
Exercícios
1) Na orientação a objetos existe um importante conceito, que é a herança.
Marque a alternativa que melhor define herança em orientação a objetos.
A) Herança é o comportamento dos objetos.
B) Herança ocorre quando o valor de um atributo pode ser compartilhado entre vários objetos.
C) A palavra-chave "herança" permite utilizar uma classe que está em outro pacote.
D) Existe herança quando duas ou mais classes dependem uma da outra.
E) A herança é um mecanismo para aprimorar as classes existentes.
2) A redução de um código permite maior facilidade para que o desenvolvedor possa revisar
seu código, realizar a manutenção dos recursos e ter melhor visibilidade sobre a
implementação de uma aplicação.
Quando é identificada a possibilidade de usar herança em um projeto?
A) Quando existe a necessidade de reduzir código.
B) Quando existe relação entre classes.
C) Quando se deseja aumentar a produtividade no desenvolvimento.
D) Quando há relação em atributos em comum entre duas ou mais classes.
E) Quando classes contêm muitos atributos.
3) Em uma estrutura de programação orientada a objetos, o desenvolvedor deve estar atendo
ao comportamento generalizado dos objetos, assim como ao processo de especialização das
operações ou atributos.
Em relação à herança, o que é possível afirmar?
A) Classes especializadas são aquelas específicas de determinado domínio.
B) Em uma estrutura de herança, todas as classes necessitam conter o método main().
C) A herança acontece quando, no desenvolvimento, existe a possibilidade de reúso de
componentes.
D) Em herança existem classes genéricas e especializadas.
E) Métodos não podem ser herdados por subclasses.
4) As classes em Java podem ser classificadas em diferentes tipos. Em geral, para declarar as
classes, é necessário criar um nome e certificar-se de que a classe tem um corpo,
especificado dentro de um par de chaves { }. Métodos, atributos e palavras-chaves também
devem ser declarados corretamente.
Analise o seguinte código de uma classe em Java:
public class Agua extends Bebida {
private String ph;
public String getPh(){ return ph;
}
public void setPh(String ph){
this.ph=ph;
}
}
A) O código é inválido, pois não tem um método main().
B) Não é necessária a criação de métodos de acesso como get e set, pois a classe contém apenas
um atributo.
C) A palavra-chave "extends" informa que a classe "Agua" é uma extensão da classe "Bebida".
D) A classe"Agua", quando instanciada, terá acesso apenas ao atributo ph, por meio dos
métodos set e get.
E) A classe não poderá ser instanciada, pois é necessário que os métodos de acesso da
superclasse estejam implementados na subclasse.
As classes públicas podem ser acessadas por qualquer outra classe, enquanto as classes
privadas podem ser acessadas apenas por métodos da mesma classe. As palavras-chave
utilizadas são, respectivamente, private e public na linguagem de programação Java.
5)
Analise o código a seguir:
public class Animal {
private int idAnimal;
private String nome;
private int idade;
public String getNome(){
return nome;
}
public void setNome(String nome){
this.nome = nome;
}
public int getIdade(){
return idade;
}
public void setIdade(int idade){
this.idade = idade;
}
}
=================== // ============================
public class Mamifero extends Animal{
private String gestacao;
private String especVida;
public String getGestacao(){
return gestacao;
}
public void setGestacao(String gestacao){
this.gestacao = gestacao;}
public String getEspecVida(){
return especVida;
}
public void setEspecVida(String especVida){
this.especVida = especVida;
}
}
=============================//==========================
public class Cachorro Mamifero{
private String raca;
public String getRaca(){
return raca;
}
public void setRaca(String raca){
this.raca = raca;
}
}
============================//============================
public class Homem extends Mamifero{
private String etnia; public String getEtnia(){
return etnia;
}
public void setEtnia(String etnia){
this.etnia = etnia;
}
}
A) A classe "Animal" é subclasse de "Mamifero".
B) A classe "Cachorro" está estendendo de "Mamifero".
C) A sintaxe da classe "Homem" está incorreta.
D) Por se tratar de herança, a classe "Homem" poderá herdar apenas membros da classe
"Mamifero".
E) A classe "Homem" é subclasse; a classe "Mamifero" é subclasse e superclasse; e a classe
"Animal" é superclasse.
Na prática
Além de conhecer os conceitos acerca da herança, é necessário compreender sua sintaxe, que, por
mais que seja simples, exige planejamento sobre o objetivo e a forma como será implementada. A
sintaxe usada para declarar que uma classe estende de outra também utiliza palavras reservadas
atribuídas às estruturas de código.
Neste Na Prática, assista ao vídeo e veja como implementar uma estrutura de herança na
linguagem de programação Java.
As imagens do vídeo a seguir possuem audiodescrição. Para acessar o recurso,
clique aqui
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
https://creator-files.plataforma.grupoa.education/undefined/9111_Audiodescricao_Na_Pratica-2026-04-06T14:22:47-03:00.pdf
https://fast.player.liquidplatform.com/pApiv2/embed/cee29914fad5b594d8f5918df1e801fd/fd338fcef44dc6e854ab525f89aa77a9
Saiba mais
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do professor:
Herança em Java (extends) – Conceito e exemplo
Neste vídeo, você vai ver a aplicação e para que serve uma herança em Java, compreendendo sua
vantagem para o reaproveitamento de código na organização das classes.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
Herança em Java: teoria e prática
Leia o seguinte artigo, em que são apresentados os conceitos de herança e sua aplicação. São
abordados exemplos sobre a aplicação de herança simples, seus principais benefícios e o uso de
construtores.
Aponte a câmera para o código e acesse o link do conteúdo ou clique no código para acessar.
OCA Java SE 8 – Guia de estudos para o exame 1Z0-808
Acompanhe, no Capítulo 7, Herança de classes, como implementar e usar herança e os tipos de
classes, seus aspectos básicos, métodos e outras ações que consistem em um dos três princípios
principais de programação.
Conteúdo interativo disponível na plataforma de ensino!
https://www.youtube.com/embed/1G-WpOA2k04
https://medium.com/caiquefortunato/heran%C3%A7a-em-java-teoria-e-pr%C3%A1tica-2ca7d9b0f3de