Ereditarietà di base
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 48 di 104.
L'ereditarietà consente a una classe di acquisire le proprietà e i comportamenti di un'altra classe. La classe da cui si eredita è chiamata classe base (o classe genitore), mentre la classe che eredita è chiamata classe derivata (o classe figlia).
Per creare una classe derivata, usa i due punti seguiti dallo specificatore di accesso e dal nome della 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;
}
};La classe Dog ora può accedere sia a name sia a eat() di Animal, oltre al proprio metodo bark(). Questa è l’essenza dell’ereditarietà: riutilizzare il codice esistente aggiungendo nuove funzionalità.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Ereditato da Animal
myDog.bark(); // Definito in DogLa parola chiave public prima di Animal specifica il tipo di ereditarietà. L’ereditarietà pubblica significa che i membri pubblici della classe base rimangono pubblici nella classe derivata. Questa è la forma più comune e rappresenta una relazione «è-un»: un Dog è un Animal.
Sfida
FacileCostruiamo una semplice gerarchia di veicoli che dimostri l'ereditarietà in azione. Creerai una classe base Vehicle e una classe derivata Motorcycle che la estende con comportamenti specifici.
Organizzerai il codice in tre file:
Vehicle.h: Definisci una classe baseVehiclecon:- Un membro pubblico
std::string brand - Un membro pubblico
int year - Un metodo pubblico
displayInfo()che stampa la marca e l'anno del veicolo nel formato:Brand: <brand>, Year: <year>
- Un membro pubblico
Motorcycle.h: Definisci una classeMotorcycleche eredita pubblicamente daVehicle. Questa classe derivata dovrebbe aggiungere:- Un membro pubblico
int engineCCper la cilindrata del motore - Un metodo pubblico
revEngine()che stampa:<brand> goes vroom vroom!
La classe
Motorcycleerediterà automaticamentebrand,yearedisplayInfo()daVehicle.- Un membro pubblico
main.cpp: Leggi tre input (ciascuno su una riga separata):- Nome della marca (stringa)
- Anno (intero)
- Cilindrata in CC (intero)
Crea un oggetto
Motorcycle, imposta i suoi membri ereditati (brandeyear) e anche il suo membroengineCC. Poi produci le tre righe di output nell'ordine seguente: prima chiama il metodo ereditatodisplayInfo(), poi stampa tu la cilindrata constd::cout << "Engine: " << moto.engineCC << "cc" << std::endl;e infine chiama il metodo specifico della motociclettarevEngine(). Questo dimostra l'ereditarietà utilizzando sia il metodo ereditato sia il metodo proprio della classe derivata.Formato dell'output:
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
Per esempio, con gli input Harley, 2022 e 1200:
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!Non dimenticare di includere le guardie di inclusione nei file header e di usare #include "Vehicle.h" nell'header Motorcycle per accedere alla classe base.
Provalo tu
#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: Crea un oggetto Motorcycle
// TODO: Imposta i membri brand, year ed engineCC dell'oggetto
// TODO: Chiama displayInfo() per mostrare le informazioni ereditate
// TODO: Stampa le informazioni sul motore nel formato: Engine: <engineCC>cc
// TODO: Chiama revEngine() per mostrare il comportamento specifico della motocicletta
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online