Héritage en C++

27 Sep 2019 27 Sep 2019 32649 vues ESSADDOUKI Mostafa 4 min de lecture
Introduction et syntaxe de base
1 Introduction au langage C++ 2 Entrée-sortie en C++ - cin et cout 3 Inférence de type avec le mot-clé auto en C++ 4 Classe std::string et les chaînes de caractères en C++ 5 Les structures conditionnelles (if et switch) en C++ (C++17 et C++20) 6 Les boucles en C++ (C++17 et C++20) 7 La gestion des fichiers en C++
Pointeurs et fonctions
8 Introduction aux pointeurs en C++ - Déclaration et interêts 9 Les références en C++ - déclaration et interêts 10 Les tableaux en C++ - Déclaration et interêts 11 Introduction aux fonctions en C++ 12 Passer des arguments à une fonction en C++ 13 Déclarer un paramètre const en C++ 14 Les fonctions Lambda en C++ 15 Fonctions utiles (Mathématiques et caractères) en C++
Programmation OO
16 Classes et objets en C++ 17 Spécificateurs d'accès en C++ 18 Constructeurs et destructeur d'une classe en C++ 19 Fonctions membres en C++ 20 Membres statiques d'une classe en C++ 21 Fonctions en ligne en C++ - inline 22 Fonctions et classes amies en C++ - friend 23 Surcharge des fonctions en C++ 24 Surcharge des opérateurs en C++ 25 Héritage en C++ 26 La gestion d'exceptions en C++ : déclaration, utilisation et personnalisation 27 fonctions et classes templates en C++ 28 Les nouveautés C++20 pour améliorer les templates en C++
Structures de données
29 Introduction aux structures de données 30 Les structures en C++ et la différence avec les structures en C 31 Les listes chaînées en C++ 32 Les piles en C++ 33 File d'attente en C++ 34 Arbre binaire de recherche : définition et mise en oeuvre en C++
La bibliothèque standard (STL)
35 Introduction à la bibliothèque de Template Standard STL 36 Les itérateurs en C++ - définition, déclaration et exemples 37 La classe array en C++ (bibliothèque STL) <array> 38 La classe vector de la bibliothèque STL <vector> 39 La classe deque en C++ ( Bibliothèque STL) 40 La classe list en C++ (bibliothèque STL) <list> 41 La classe stack (Pile) en C++ (bibliothèque STL) <stack> 42 La classe queue (File d'attente) en C++ (bibliothèque STL) <queue> 43 La file d'attente prioritaire (classe priority_queue) - Bibliothèque STL 44 Les ensembles en C++ (Classe set <set> - Bibliothèque STL) 45 Les dictionnaires en C++ : Classe map (Bibliothèque STL) 46 Introduction aux algorithmes de la bibliothèque STL (programmation compétitive) 47 Tri et méthodes associées en C++ - Bibliothèque STL 48 Recherche dichotomique et méthodes associées en C++ - Bibliothèque STL 49 Appliquer un prédicat ou une fonction aux éléments d'une séquence en C++ - Bibliothèque STL 50 Recherche dans une séquence et méthodes associées en C++ - Bibliothèque STL

L'héritage est l'un des piliers de la programmation orientée objet. Il permet de créer une nouvelle classe à partir d'une classe existante, en réutilisant ses données et méthodes. La classe source est appelée classe de base (ou mère/superclasse), et la nouvelle classe est la classe dérivée (ou enfant/sous-classe).

Avantages de l'héritage

L'héritage évite la réécriture de code redondant, réduit les risques de bogues, et est la base indispensable du polymorphisme.

   
Syntaxe C++
class nom_sousclasse : mode_acces nom_superclasse {
    // membres supplémentaires
};
Remarque

Tous les membres d'une classe, sauf les privés, sont hérités par la classe dérivée. Les membres privés existent dans l'objet mais ne sont pas directement accessibles depuis la sous-classe.

Contrôle d'accès et héritage

Le mode d'accès lors de l'héritage détermine comment les membres de la classe de base apparaissent dans la classe dérivée.

Membre dans la baseHéritage publicHéritage protectedHéritage private
privateNon héritéNon héritéNon hérité
protectedprotectedprotectedprivate
publicpublicprotectedprivate
Usage courant

En pratique, l'héritage public est de loin le plus utilisé. L'héritage protected ou private est rare et réservé à des cas de composition avancée.

Une classe dérivée hérite de toutes les méthodes de la classe de base, sauf : les constructeurs et destructeurs, les opérateurs surchargés, et les fonctions amies.

Types d'héritage en C++

C++ supporte 5 types d'héritage :

TypeDescriptionExemple
SimpleUne classe dérivée hérite d'une seule baseEtudiant : Personne
MultipleUne classe dérivée hérite de plusieurs basesProfAssistant : Etudiant, Professeur
HiérarchiquePlusieurs classes dérivent d'une même baseEtudiant : Personne et Professeur : Personne
MultiniveauChaîne A → B → CEtudiantInterne : Etudiant : Personne
HybrideCombinaison hiérarchique + multiniveauProfAssistant : Etudiant, Professeur : Personne

Ordre d'appel du constructeur

Règle fondamentale

Lors de la création d'un objet d'une classe dérivée, le constructeur de la classe de base est toujours appelé en premier, puis celui de la classe dérivée. En héritage multiple, les constructeurs des bases sont appelés dans l'ordre de la liste d'héritage.

  Exemple n°2 — Ordre des appels

#include <iostream>
using namespace std;

class Base {
    int x;
public:
    Base() { cout << "Constructeur par défaut de la classe de base\n"; }
};

class Herite : public Base {
    int y;
public:
    Herite()    { cout << "Constructeur par défaut de la classe derivée\n"; }
    Herite(int i){ cout << "Constructeur paramétré de la classe derivée\n"; }
};

int main() {
    Herite d1;
    Herite d2(10);
}
Sortie
Constructeur par défaut de la classe de base
Constructeur par défaut de la classe derivée
Constructeur par défaut de la classe de base
Constructeur paramétré de la classe derivée
Appel explicite du constructeur paramétré de la base

Pour appeler un constructeur paramétré de la classe de base depuis un constructeur de la classe dérivée, on utilise la liste d'initialisation avec la syntaxe : NomBase(arguments).

  Exemple n°3 — Constructeur paramétré enchaîné

class Base {
    int x;
public:
    Base(int i) { x = i; cout << "Constructeur paramétré de la classe de base\n"; }
};

class Herite : public Base {
    int y;
public:
    Herite(int i) : Base(i) {   // appel explicite du ctor de Base
        cout << "Constructeur paramétré de la classe derivée\n";
    }
};

int main() { Herite d(10); }
Sortie
Constructeur paramétré de la classe de base
Constructeur paramétré de la classe derivée

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.