Héritage C ++

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 Dogclasse est dérivée de la Animalclasse. Depuis Dogest dérivé de Animal, les membres de Animalsont accessibles à Dog.

Héritage en C ++

Notez l'utilisation du mot-clé publiclors de l'héritage de Dog from Animal.

 class Dog : public Animal (… );

Nous pouvons également utiliser les mots-clés privateet à la protectedplace de public. Nous allons en apprendre davantage sur les différences entre l' utilisation private, publicet protectedplus 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 Dogest hérité de Animal.

 // Calling members of the Animal class dog1.eat(); dog1.sleep();

Membres protégés C ++

Le modificateur d'accès protectedest particulièrement pertinent en ce qui concerne l'héritage C ++.

Comme les privatemembres, les protectedmembres 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 protectedmembres 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 protectedet est donc accessible depuis la classe dérivée Dog. Nous pouvons voir cela comme nous l'avons initialisé typedans la Dogclasse en utilisant la fonction setType().

En revanche, la privatecouleur 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 protectedmot - clé masque les données, nous ne pouvons pas accéder au type directement à partir d'un objet de Dogou d'une Animalclasse.

 // 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 publicmot - clé afin d'hériter d'une classe d'une classe de base déjà existante. Cependant, nous pouvons également utiliser les mots private- protectedclé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:

  1. public: Si une classe dérivée est déclarée en publicmode, alors les membres de la classe de base sont hérités par la classe dérivée tels quels.
  2. private: dans ce cas, tous les membres de la classe de base deviennent privatemembres de la classe dérivée.
  3. protected: les publicmembres de la classe de base deviennent protectedmembres de la classe dérivée.

Les privatemembres de la classe de base sont toujours privatedans 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 ++

Articles intéressants...