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).
L'héritage évite la réécriture de code redondant, réduit les risques de bogues, et est la base indispensable du polymorphisme.
class nom_sousclasse : mode_acces nom_superclasse {
// membres supplémentaires
};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 base | Héritage public | Héritage protected | Héritage private |
|---|---|---|---|
private | Non hérité | Non hérité | Non hérité |
protected | protected | protected | private |
public | public | protected | private |
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 :
| Type | Description | Exemple |
|---|---|---|
| Simple | Une classe dérivée hérite d'une seule base | Etudiant : Personne |
| Multiple | Une classe dérivée hérite de plusieurs bases | ProfAssistant : Etudiant, Professeur |
| Hiérarchique | Plusieurs classes dérivent d'une même base | Etudiant : Personne et Professeur : Personne |
| Multiniveau | Chaîne A → B → C | EtudiantInterne : Etudiant : Personne |
| Hybride | Combinaison hiérarchique + multiniveau | ProfAssistant : Etudiant, Professeur : Personne |
Ordre d'appel du constructeur
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);
}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
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); }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.