Herança Básica
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy — lição 48 de 104.
Herança permite que uma classe adquira as propriedades e comportamentos de outra classe. A classe da qual se herda é chamada de classe base (ou pai), e a classe que herda é chamada de classe derivada (ou filha).
Para criar uma classe derivada, use dois pontos seguidos pelo especificador de acesso e o nome da classe base:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};A classe Dog agora tem acesso tanto a name quanto a eat() de Animal, além de seu próprio método bark(). Esta é a essência da herança: reutilizar código existente enquanto se adiciona nova funcionalidade.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Herdado de Animal
myDog.bark(); // Definido em DogA palavra-chave public antes de Animal especifica o tipo de herança. A herança pública significa que os membros públicos da classe base permanecem públicos na classe derivada. Esta é a forma mais comum e modela um relacionamento "é-um": um Dog é um Animal.
Desafio
FácilVamos construir uma hierarquia simples de veículos que demonstra a herança em ação. Você criará uma classe base Vehicle e uma classe derivada Motorcycle que a estende com um comportamento especializado.
Você organizará seu código em três arquivos:
Vehicle.h: Defina uma classe baseVehiclecom:- Um membro público
std::string brand - Um membro público
int year - Um método público
displayInfo()que imprime a marca e o ano do veículo no formato:Brand: <brand>, Year: <year>
- Um membro público
Motorcycle.h: Defina uma classeMotorcycleque herda publicamente deVehicle. Esta classe derivada deve adicionar:- Um membro público
int engineCCpara a cilindrada do motor - Um método público
revEngine()que imprime:<brand> goes vroom vroom!
A classe
Motorcycleherdará automaticamentebrand,yearedisplayInfo()deVehicle.- Um membro público
main.cpp: Leia três entradas (cada uma em uma linha separada):- Nome da marca (string)
- Ano (inteiro)
- Cilindrada do motor (inteiro)
Crie um objeto
Motorcycle, defina seus membros herdados (brandeyear), bem como seu próprio membroengineCC. Em seguida, demonstre a herança chamando tanto o método herdado quanto o método específico da motocicleta.Formato de saída:
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
Por exemplo, com as entradas Harley, 2022 e 1200:
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!Não se esqueça de incluir protetores de cabeçalho (header guards) em seus arquivos de cabeçalho e usar #include "Vehicle.h" no seu cabeçalho Motorcycle para acessar a classe base.
Folha de consulta
A herança permite que uma classe adquira propriedades e comportamentos de outra classe. A classe da qual se herda é a classe base (pai), e a classe que herda é a classe derivada (filho).
Para criar uma classe derivada, use dois pontos seguidos pelo especificador de acesso e o nome da classe base:
class Animal {
public:
std::string name;
void eat() {
std::cout << name << " is eating" << std::endl;
}
};
class Dog : public Animal {
public:
void bark() {
std::cout << name << " says woof!" << std::endl;
}
};A classe derivada tem acesso aos membros públicos da classe base, além de seus próprios membros:
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Herdado de Animal
myDog.bark(); // Definido em DogA palavra-chave public especifica a herança pública, o que significa que os membros públicos da classe base permanecem públicos na classe derivada. Isso modela uma relação do tipo "é-um".
Experimente você mesmo
#include <iostream>
#include <string>
#include "Motorcycle.h"
using namespace std;
int main() {
string brand;
int year;
int engineCC;
cin >> brand;
cin >> year;
cin >> engineCC;
// TODO: Criar um objeto Motorcycle
// TODO: Definir seus membros brand, year e engineCC
// TODO: Chamar displayInfo() para mostrar informações herdadas
// TODO: Imprimir as informações do motor no formato: Engine: <engineCC>cc
// TODO: Chamar revEngine() para demonstrar o comportamento específico da motocicleta
return 0;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos ExternosBuild e Compilação em C++Arquivos Header e SourceNamespaces e EscopoIntrodução a OOP em C++Classes vs ObjetosO Ponteiro 'this'Métodos (Funções Membro)Atributos (Membros de Dados)Básico de Ctors e DtorsRecapitulação - Calculadora Simples4Propriedades de Classe
Membros de Instância vs EstáticosGetters e SettersFunções de Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRecapitulação - Gerenciador de Conta Bancária7Herança
Herança BásicaNíveis de Acesso na HerançaOrdem de Chamada de Ctor e DtorSobrescrita de MétodosFunções Virtuais e VTableHerança MúltiplaHerança VirtualRecapitulação - Hierarquia de Funcionários2Gerenciamento de Memória
Memória Stack vs HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Smart Pointers em C++RAII em C++Recapitulação - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de Acesso em C++Especificadores de Acesso em DetalhesOcultação de InformaçãoStruct vs ClassClasses Aninhadas e InternasRecapitulação - Sistema de Registros de Alunos8Polimorfismo
Polimorfismo de Compilação vs Tempo de ExecuçãoSobrecarga de FunçõesFunções Virtuais RevisitadasFunções Virtuais PurasClasses AbstratasDesign de Interfaces em C++Dynamic Casting e RTTIRecapitulação - Calculadora de Formas3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentaçãoListas de Inicialização do ConstrutorConstrutores DelegadosMergulho Profundo em DestrutoresRegra dos Três / Cinco / ZeroRecapitulação - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de StreamSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçãoTemplates de ClasseEspecialização de TemplatesTemplates VariádicosFundamentos de SFINAE e Type TraitsRecapitulação - Container Genérico