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 uma relação de "é um": um Dog é um Animal.
Desafio
FácilVamos criar 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. Essa 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), assim como seu próprio membroengineCC. Em seguida, produza as três linhas de saída na ordem: primeiro chame o método herdadodisplayInfo(), depois imprima você mesmo a cilindrada do motor comstd::cout << "Engine: " << moto.engineCC << "cc" << std::endl;e, por fim, chame o método específico de motocicletasrevEngine(). Isso demonstra a herança usando tanto o método herdado quanto o próprio método da classe derivada.Formato da 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 guardas de cabeçalho nos seus arquivos de cabeçalho e usar #include "Vehicle.h" no seu cabeçalho Motorcycle para acessar a classe base.
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 as 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 POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online