C++ Héritage

En programmation orientée objet, l'un des concepts les plus importants est l'héritage. L'héritage nous permet de définir une classe à partir d'une autre classe, ce qui facilite la création et la maintenance d'une application. Ce faisant, il permet également de réutiliser les fonctionnalités du code et d'améliorer l'efficacité d'exécution.

Lors de la création d'une classe, vous n'avez pas besoin de réécrire de nouveaux membres de données et fonctions membres ; vous devez seulement spécifier que la classe nouvellement créée hérite des membres d'une classe existante. Cette classe existante est appeléeclasse de base, la classe nouvellement créée est appeléeclasse dérivée。

L'héritage représente une relation de typeest-un. Par exemple, les mammifères sont des animaux, les chiens sont des mammifères, donc les chiens sont des animaux, etc.

Le code est le suivant :

// Classe de base
class Animal {
    // fonction eat()
    // fonction sleep()
};


// classe dérivée
class Dog : public Animal {
    // fonction bark()
};

Classe de base & classe dérivée

Une classe peut être dérivée de plusieurs classes, ce qui signifie qu'elle peut hériter des données et des fonctions de plusieurs classes de base. Pour définir une classe dérivée, nous utilisons une liste de dérivation de classe pour spécifier les classes de base. La liste de dérivation de classe nomme une ou plusieurs classes de base, sous la forme suivante :

class derived-class: access-specifier base-class

Ici, le modificateur d'accès access-specifier estpublic、protectedouprivateParmi eux, base-class est le nom d'une classe précédemment définie. Si aucun modificateur d'accès access-specifier n'est utilisé, la valeur par défaut est private.

Supposons qu'il existe une classe de baseShape,Rectangleest sa classe dérivée, comme indiqué ci-dessous :

Exemple

#include <iostream> using namespace std; // Classe de base class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Classe dérivée class Rectangle: public Shape { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; Rect.setWidth(5); Rect.setHeight(7); // Afficher l'aire de l'objet cout << "Aire totale : " << Rect.getArea() << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Total area: 35

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

Une classe dérivée peut accéder à tous les membres non privés de la classe de base. Par conséquent, si un membre de la classe de base n'est pas destiné à être accessible par les fonctions membres de la classe dérivée, il doit être déclaré privé dans la classe de base.

Nous pouvons résumer les différents types d'accès en fonction des autorisations d'accès, comme suit :

Visiterpublicprotectedprivate
la même classeouiouioui
classe dérivéeouiouinon
classes externesouinonnon

Une classe dérivée hérite de toutes les méthodes de la classe de base, sauf dans les cas suivants :

  • Le constructeur, le destructeur et le constructeur de copie de la classe de base.
  • Les opérateurs surchargés de la classe de base.
  • Les fonctions amies de la classe de base.

Types d'héritage

Lorsqu'une classe est dérivée d'une classe de base, la classe de base peut être héritée selon plusieurs types :public、protectedou private. Le type d'héritage est spécifié par le modificateur d'accès access-specifier expliqué ci-dessus.

Nous utilisons rarement l'héritageprotectedou private, en utilisant généralementpublicHéritage. Lorsque vous utilisez différents types d'héritage, suivez les règles suivantes :

  • Héritage public (public) :Lorsqu'une classe est dérivée d'une classe de base en modepublic, les membres de typepublicde la classe de base appartiennent aussi à la classe dérivée.public, les membresprotectedde la classe de base appartiennent aussi à la classe dérivée. Membresprotected, de la classe de baseprivatene sont pas directement accessibles depuis la classe dérivée, mais on peut y accéder en appelant les membrespublicetprotectedde la classe de base pour y accéder.
  • Héritage protégé (protected) :Lorsqu'une classe est dérivée enprotectedd'une classe de base, lepublicde la classe de base etprotectedLes membres deviendront des membres de la classe dérivée.protectedmembres.
  • Héritage privé (private):Lorsqu'une classe est dérivée deprivateune classe de base, de la classe de basepublicetprotectedLes membres deviendront des membres de la classe dérivée.privatemembres.

Héritage multiple

L'héritage multiple signifie qu'une sous-classe peut avoir plusieurs classes parentes et qu'elle hérite des caractéristiques de plusieurs classes parentes.

Les classes C++ peuvent hériter de membres de plusieurs classes, avec la syntaxe suivante :

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

où le modificateur d'accès pour l'héritage estpublic、protectedouprivateL'un d'eux est utilisé pour modifier chaque classe de base, et les classes de base sont séparées par des virgules, comme indiqué ci-dessus. Regardons maintenant l'exemple suivant ensemble :

Exemple

#include <iostream> using namespace std; // Classe de base Shape class Shape { public: void setWidth(int w) { width = w; } void setHeight(int h) { height = h; } protected: int width; int height; }; // Classe de base PaintCost class PaintCost { public: int getCost(int area) { return area * 70; } }; // Classe dérivée class Rectangle: public Shape, public PaintCost { public: int getArea() { return (width * height); } }; int main(void) { Rectangle Rect; int area; Rect.setWidth(5); Rect.setHeight(7); area = Rect.getArea(); // Afficher l'aire de l'objet cout << "Aire totale : " << Rect.getArea() << endl; // Afficher le coût total cout << "Coût total de peinture : $" << Rect.getCost(area) << endl; return 0; }

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Total area: 35
Total paint cost: $2450
autres extensions