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 maintenant accès à la fois à name et eat() de Animal, ainsi qu'à 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 avant 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. Il s’agit de 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 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 allez organiser 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 debrandles membresyearetdisplayInfo(), ainsi que la méthodeVehicle.- un membre public
main.cpp: lisez trois entrées (chacune sur une ligne distincte) :- Nom de la marque (chaîne de caractères)
- Année (entier)
- Cylindrée du moteur en CC (entier)
Créez un objet
Motorcycle, définissez ses membres hérités (brandetyear) ainsi que son propre membreengineCC. Produisez ensuite les trois lignes de sortie dans l’ordre : appelez d’abord la méthode héritéedisplayInfo(), affichez ensuite vous-même la cylindrée avecstd::cout << "Engine: " << moto.engineCC << "cc" << std::endl;, puis appelez enfin la méthode spécifique à la motorevEngine(). Cela démontre l’héritage en utilisant à la fois la méthode héritée et la propre méthode de la classe dérivée.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 protections contre les inclusions multiples 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.
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 externesGénération et compilation en C++Fichiers d’en-tête et fichiers sourceEspaces de noms et portéeIntroduction à la POO en C++Classes et objetsLe pointeur « this »Méthodes (fonctions membres)Attributs (membres de données)Bases des constructeurs et destructeursRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d’instance et statiquesAccesseurs et mutateursFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d’accès de l’héritageOrdre d’appel des constructeurs et destructeursRedéfinition des méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif : hiérarchie des employés10Vue d’ensemble de la STL
Vue d’ensemble et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - fréquence des mots13Modèles de conception, partie 1
Introduction aux modèles de conceptionModèle SingletonFabrique et fabrique abstraiteModèle BuilderModèle ObserverModèle Strategy2Gestion de la mémoire
Mémoire de pile ou de tasPointeurs et référencesMémoire dynamique (new/delete)Pointeurs intelligents 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 de l’informationStruct vs classeClasses imbriquées et internesRécapitulatif - Système de gestion des dossiers étudiants8Polymorphisme
Polymorphisme à la compilation vs à l’exécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d’interfaces en C++Conversion dynamique et RTTIRécapitulatif - Calculateur de formes3Constructeurs et destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d’initialisation des constructeursConstructeurs déléguésApprofondissement des destructeursRègle des trois / cinq / zéroRécapitulatif - Classe String6Surcharge des opérateurs
Introduction à la surcharge des 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 des templatesTemplates variadiquesBases de SFINAE et des traits de typesRécapitulatif - Conteneur génériqueEntraînez-vous par vous-même : Compilateur C++ en ligne