Héritage de base
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy — leçon 48 sur 104.
L'héritage permet à une classe d'acquérir les propriétés et les comportements d'une autre classe. La classe dont on hérite est appelée la classe de base (ou parent), et la classe qui hérite est appelée la classe dérivée (ou enfant).
Pour créer une classe dérivée, utilisez deux-points suivis du spécificateur d'accès et du nom de la classe de 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 a désormais accès à la fois à name et eat() de Animal, en plus de sa propre méthode bark(). C'est l'essence même de l'héritage : réutiliser le code existant tout en ajoutant de nouvelles fonctionnalités.
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Hérité de Animal
myDog.bark(); // Défini dans DogLe mot-clé public devant Animal spécifie le type d'héritage. L'héritage public signifie que les membres publics de la classe de base restent publics dans la classe dérivée. C'est la forme la plus courante et elle modélise une relation « est un » : un Dog est un Animal.
Défi
FacileConstruisons une hiérarchie de véhicules simple qui démontre l'héritage en action. Vous allez créer une classe de base Vehicle et une classe dérivée Motorcycle qui l'étend avec un comportement spécialisé.
Vous organiserez votre code sur trois fichiers :
Vehicle.h: Définissez une classe de baseVehicleavec :- Un membre public
std::string brand - Un membre public
int year - Une méthode publique
displayInfo()qui affiche la marque et l'année du véhicule au format :Brand: <brand>, Year: <year>
- Un membre public
Motorcycle.h: Définissez une classeMotorcyclequi hérite publiquement deVehicle. Cette classe dérivée doit ajouter :- Un membre public
int engineCCpour la cylindrée du moteur - Une méthode publique
revEngine()qui affiche :<brand> goes vroom vroom!
La classe
Motorcyclehéritera automatiquement debrand,yearetdisplayInfo()deVehicle.- Un membre public
main.cpp: Lisez trois entrées (chacune sur une ligne séparée) :- Nom de la marque (chaîne de caractères)
- Année (entier)
- Cylindrée du moteur (entier)
Créez un objet
Motorcycle, définissez ses membres hérités (brandetyear) ainsi que son propre membreengineCC. Ensuite, démontrez l'héritage en appelant à la fois la méthode héritée et la méthode spécifique à la moto.Format de sortie :
Brand: <brand>, Year: <year> Engine: <engineCC>cc <brand> goes vroom vroom!
Par exemple, avec les entrées Harley, 2022 et 1200 :
Brand: Harley, Year: 2022
Engine: 1200cc
Harley goes vroom vroom!N'oubliez pas d'inclure des gardes d'inclusion (header guards) dans vos fichiers d'en-tête et d'utiliser #include "Vehicle.h" dans votre en-tête Motorcycle pour accéder à la classe de base.
Aide-mémoire
L'héritage permet à une classe d'acquérir les propriétés et les comportements d'une autre classe. La classe dont on hérite est la classe de base (parent), et la classe qui hérite est la classe dérivée (enfant).
Pour créer une classe dérivée, utilisez deux points suivis du spécificateur d'accès et du nom de la classe de 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 dérivée a accès aux membres publics de la classe de base plus ses propres membres :
Dog myDog;
myDog.name = "Buddy";
myDog.eat(); // Hérité de Animal
myDog.bark(); // Défini dans DogLe mot-clé public spécifie l'héritage public, ce qui signifie que les membres publics de la classe de base restent publics dans la classe dérivée. Cela modélise une relation de type « est un ».
Essayez vous-même
#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: Créer un objet Motorcycle
// TODO: Définir ses membres brand, year, et engineCC
// TODO: Appeler displayInfo() pour afficher les informations héritées
// TODO: Imprimer les informations du moteur au format : Engine: <engineCC>cc
// TODO: Appeler revEngine() pour démontrer le comportement spécifique à la moto
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesBuild et Compilation C++Fichiers d'en-tête et Fichiers sourceEspaces de noms et PortéeIntroduction à la POO en C++Classes vs ObjetsLe pointeur 'this'Méthodes (Fonctions membres)Attributs (Membres de données)Bases des Ctors et DtorsRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d'instance vs membres statiquesGetters et SettersFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d'accès à l'héritageOrdre d'appel des Ctor et DtorRedéfinition de méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif - Hiérarchie des employés10Présentation de la STL
Présentation et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - Fréquence des mots13Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonFabrique & Fabrique abstraitePatron MonteurPatron ObservateurPatron Stratégie2Gestion de la mémoire
Mémoire Pile vs TasPointeurs et RéférencesMémoire dynamique (new/delete)Smart Pointers en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d'accès en C++Spécificateurs d'accès en profondeurMasquage d'informationStruct vs ClassClasses imbriquées et internesRécapitulatif - Système de gestion d'étudiants8Polymorphisme
Polymorphisme : Compilation vs ExécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d'interfaces en C++Dynamic Casting & RTTIRécapitulatif - Calculateur de formes11Concepts avancés de la POO
Composition vs HéritageMixins via CRTPIdiome PimplEffacement de typeEnum Classes & Typage fortGestion des exceptions en POOHiérarchies d'exceptions personnalisées14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeRAII en tant que patron3Constructeurs et Destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d'initialisation du constructeurConstructeurs déléguésAnalyse approfondie du destructeurRègle de trois / cinq / zéroRécapitulatif - Classe String6Surcharge d'opérateurs
Introduction à la surcharge d'opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l'opérateur d'affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif - Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation de templatesTemplates variadiquesBases de SFINAE & Type TraitsRécapitulatif - Conteneur générique