Redéfinition de fonction en C++ expliquée - Exemples pratiques et bonnes pratiques
Redéfinition de fonction en C++ expliquée
Ce guide démystifie la redéfinition de fonction en C++, fournissant des exemples clairs, des bonnes pratiques et une explication pas à pas qu'un développeur C++ expérimenté utiliserait en production.
Pourquoi la redéfinition de fonction est importante
En programmation orientée objet, l'héritage permet à une classe dérivée d'étendre ou de modifier le comportement d'une classe de base. Quand la même fonction membre est déclarée dans la classe de base et la classe dérivée, l'implémentation dérivée « redéfinit » celle de la base. Quand vous appelez cette fonction à travers un objet de classe dérivée, la version redéfinie s'exécute.
Exemple 1 : Redéfinition de base
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Fonction de base" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Fonction dérivée" << endl;
}
};
int main() {
Derived d;
d.print();
return 0;
}
Sortie
Fonction dérivée
L'appel de print() sur une instance Derived exécute la fonction redéfinie, pas la version de base.

Si vous créez un objet Base et appelez print(), vous verrez l'implémentation de base originale.
Base b; b.print(); // Sortie : Fonction de base
Accès à la fonction de base redéfinie
Parfois, vous devez invoquer explicitement la version de la classe de base. Deux techniques courantes sont :
- Utiliser l'opérateur de résolution de portée
::. - Employer un pointeur de classe de base qui pointe vers un objet dérivé (quand la fonction n'est pas virtuelle).
Exemple 2 : Résolution de portée pour appeler la fonction de base
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Fonction de base" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Fonction dérivée" << endl;
}
};
int main() {
Derived d1, d2;
d1.print();
d2.Base::print(); // Appel explicite à Base::print
return 0;
}
Sortie
Fonction dérivée Fonction de base
Exemple 3 : Appel de la fonction de base depuis la classe dérivée
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Fonction de base" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Fonction dérivée" << endl;
Base::print(); // Invoquer la version de base
}
};
int main() {
Derived d;
d.print();
return 0;
}
Sortie
Fonction dérivée Fonction de base
Exemple 4 : Utilisation d'un pointeur de base pour accéder à la fonction de base
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Fonction de base" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Fonction dérivée" << endl;
}
};
int main() {
Derived d;
Base* ptr = &d; // Pointeur vers Base pointant vers objet Derived
ptr->print(); // Appelle Base::print car la fonction n'est pas virtuelle
return 0;
}
Sortie
Fonction de base
Quand la fonction n'est pas déclarée virtual, un pointeur de classe de base invoque l'implémentation de base. Pour obtenir un comportement polymorphe réel, déclarez la fonction de base virtual et redéfinissez-la dans la classe dérivée.
Ces exemples illustrent la mécanique de la redéfinition de fonction en C++. En maîtrisant ces concepts, vous pouvez écrire un code plus propre et plus maintenable qui tire parti du polymorphisme efficacement.
Langue C
- Maîtriser les opérateurs C++ : Guide complet avec exemples pratiques
- Commentaires C++ : Bonnes pratiques pour un code lisible et maintenable
- Comment passer des tableaux aux fonctions en C++ : Guide pratique
- Les Fonctions en C++ Expliquées avec des Exemples de Code Pratiques
- Maîtriser les fonctions en C : Structure, déclaration et bonnes pratiques
- Langage C++ : Vue d'ensemble et caractéristiques clés
- Constantes et littéraux en C++ : Types, syntaxe et bonnes pratiques
- Guide complet des opérateurs C++ : Types, utilisation et bonnes pratiques
- Maîtriser les types numériques en C++ : Guide pratique