Dans ce tutoriel, nous allons découvrir l'héritage en C ++ à l'aide d'exemples.
L'héritage est l'une des fonctionnalités clés de la programmation orientée objet en C ++. Cela nous permet de créer une nouvelle classe (classe dérivée) à partir d'une classe existante (classe de base).
La classe dérivée hérite des fonctionnalités de la classe de base et peut avoir ses propres fonctionnalités supplémentaires. Par exemple,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Ici, la Dog
classe est dérivée de la Animal
classe. Depuis Dog
est dérivé de Animal
, les membres de Animal
sont accessibles à Dog
.

Notez l'utilisation du mot-clé public
lors de l'héritage de Dog from Animal.
class Dog : public Animal (… );
Nous pouvons également utiliser les mots-clés private
et à la protected
place de public
. Nous allons en apprendre davantage sur les différences entre l' utilisation private
, public
et protected
plus loin dans ce tutoriel.
est-une relation
L'héritage est une relation est-une . Nous n'utilisons l'héritage que si une relation is -a est présente entre les deux classes.
Voici quelques exemples:
- Une voiture est un véhicule.
- L'orange est un fruit.
- Un chirurgien est un médecin.
- Un chien est un animal.
Exemple 1: Exemple simple d'héritage C ++
// C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )
Production
Je peux manger! Je peux dormir! Je peux aboyer! Woof Woof!!
Ici, dog1 (l'objet de la classe dérivée Dog
) peut accéder aux membres de la classe de base Animal
. C'est parce qu'il Dog
est hérité de Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
Membres protégés C ++
Le modificateur d'accès protected
est particulièrement pertinent en ce qui concerne l'héritage C ++.
Comme les private
membres, les protected
membres sont inaccessibles en dehors de la classe. Cependant, ils sont accessibles par des classes dérivées et des classes / fonctions d'amis .
Nous avons besoin de protected
membres si nous voulons masquer les données d'une classe, mais que nous voulons toujours que ces données soient héritées par ses classes dérivées.
Pour en savoir plus sur protected, reportez-vous à notre didacticiel sur les modificateurs d'accès C ++.
Exemple 2: membres protégés C ++
// C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )
Production
Je peux manger! Je peux dormir! Je peux aboyer! Woof Woof!! Je suis un mammifère Ma couleur est le noir
Ici, le type de variable est protected
et est donc accessible depuis la classe dérivée Dog
. Nous pouvons voir cela comme nous l'avons initialisé type
dans la Dog
classe en utilisant la fonction setType()
.
En revanche, la private
couleur variable ne peut pas être initialisée dans Dog
.
class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );
De plus, étant donné que le protected
mot - clé masque les données, nous ne pouvons pas accéder au type directement à partir d'un objet de Dog
ou d'une Animal
classe.
// Error: member "Animal::type" is inaccessible dog1.type = "mammal";
Modes d'accès dans l'héritage C ++
Dans nos didacticiels précédents, nous avons découvert les spécificateurs d'accès C ++ tels que public, private et protected.
Jusqu'à présent, nous avons utilisé le public
mot - clé afin d'hériter d'une classe d'une classe de base déjà existante. Cependant, nous pouvons également utiliser les mots private
- protected
clés et pour hériter des classes. Par exemple,
class Animal ( // code ); class Dog : private Animal ( // code );
class Cat : protected Animal ( // code );
Les différentes façons dont nous pouvons dériver des classes sont appelées modes d'accès . Ces modes d'accès ont l'effet suivant:
- public: Si une classe dérivée est déclarée en
public
mode, alors les membres de la classe de base sont hérités par la classe dérivée tels quels. - private: dans ce cas, tous les membres de la classe de base deviennent
private
membres de la classe dérivée. - protected: les
public
membres de la classe de base deviennentprotected
membres de la classe dérivée.
Les private
membres de la classe de base sont toujours private
dans la classe dérivée.
Pour en savoir plus, consultez notre didacticiel sur l'héritage C ++ public, privé et protégé.
Remplacement de la fonction membre dans l'héritage
Supposons que la classe de base et la classe dérivée ont des fonctions membres avec le même nom et les mêmes arguments.
Si nous créons un objet de la classe dérivée et essayons d'accéder à cette fonction membre, la fonction membre de la classe dérivée est appelée à la place de celle de la classe de base.
La fonction membre de la classe dérivée remplace la fonction membre de la classe de base.
En savoir plus sur le remplacement de fonction dans C ++.
Lecture recommandée: héritage multiple C ++