Héritage C ++
L'un des concepts les plus importants de la programmation orientée objet est celui de l'héritage. L'héritage nous permet de définir une classe en termes d'une autre classe, ce qui facilite la création et la maintenance d'une application. Cela offre également la possibilité de réutiliser la fonctionnalité de code et un temps de mise en œuvre rapide.
Lors de la création d'une classe, au lieu d'écrire des membres de données et des fonctions membres complètement nouveaux, le programmeur peut désigner que la nouvelle classe doit hériter des membres d'une classe existante. Cette classe existante s'appelle lebase class, et la nouvelle classe est appelée derived classe.
L'idée d'héritage met en œuvre le is arelation. Par exemple, un mammifère IS-A animal, un chien IS-A mammifère donc un chien IS-A également et ainsi de suite.
Classes de base et dérivées
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 la ou les classes de base. Une liste de dérivation de classe nomme une ou plusieurs classes de base et a la forme -
class derived-class: access-specifier base-class
Où spécificateur d'accès est l'un des public, protected, ou private, et base-class est le nom d'une classe précédemment définie. Si le spécificateur d'accès n'est pas utilisé, il est privé par défaut.
Considérez une classe de base Shape et sa classe dérivée Rectangle comme suit -
#include <iostream>
using namespace std;
// Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
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 sa classe de base. Ainsi, les membres de la classe de base qui ne devraient pas être accessibles aux fonctions membres des classes dérivées doivent être déclarés privés dans la classe de base.
Nous pouvons résumer les différents types d'accès selon - qui peut y accéder de la manière suivante -
Accès | Publique | protégé | privé |
---|---|---|---|
Même classe | Oui | Oui | Oui |
Classes dérivées | Oui | Oui | non |
Hors cours | Oui | non | non |
Une classe dérivée hérite de toutes les méthodes de classe de base avec les exceptions suivantes -
- Constructeurs, destructeurs et constructeurs de copie de la classe de base.
- Opérateurs surchargés de la classe de base.
- Les fonctions friend de la classe de base.
Type d'héritage
Lors de la dérivation d'une classe à partir d'une classe de base, la classe de base peut être héritée via public, protected ou privatehéritage. Le type d'héritage est spécifié par le spécificateur d'accès comme expliqué ci-dessus.
Nous utilisons à peine protected ou private héritage, mais publicl'héritage est couramment utilisé. Lors de l'utilisation de différents types d'héritage, les règles suivantes sont appliquées -
Public Inheritance - Lors de la dérivation d'une classe à partir d'un public classe de base, public les membres de la classe de base deviennent public membres de la classe dérivée et protected les membres de la classe de base deviennent protectedmembres de la classe dérivée. Une classe de baseprivate les membres ne sont jamais accessibles directement à partir d'une classe dérivée, mais sont accessibles via des appels au public et protected membres de la classe de base.
Protected Inheritance - En dérivant d'un protected classe de base, public et protected les membres de la classe de base deviennent protected membres de la classe dérivée.
Private Inheritance - En dérivant d'un private classe de base, public et protected les membres de la classe de base deviennent private membres de la classe dérivée.
Héritage multiple
Une classe C ++ peut hériter des membres de plus d'une classe et voici la syntaxe étendue -
class derived-class: access baseA, access baseB....
Où l'accès est l'un des public, protected, ou privateet serait donné pour chaque classe de base et ils seront séparés par une virgule comme indiqué ci-dessus. Essayons l'exemple suivant -
#include <iostream>
using namespace std;
// Base class Shape
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Base class PaintCost
class PaintCost {
public:
int getCost(int area) {
return area * 70;
}
};
// Derived class
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();
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
// Print the total cost of painting
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Total area: 35
Total paint cost: $2450