INF1101 Algorithmes et structures de données Cours 3 Héritage INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données L’héritage Concept Principe d’héritage Private, protected, public Surcharge de fonctions Constructeurs Ordre des appels de constructeurs, destructeurs et agrégat Méthodes non héritées Dérivations publiques, protégées et privées INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Concept d’héritage ObjetGeo Sphere Cube Cylindre ObjetGeo: Super-classe ou classe de base. Classe très générale. Sphere, Cube, Cylindre: sous-classe ou classe dérivée. Classes plus spécifiques. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Principe d’héritage Afin de bien représenter une situation, il faut pouvoir montrer les nuances entre des objets, et effectuer certaines généralisations. Les classes dérivées sont un mécanisme simple pour définir une nouvelle classe en ajoutant des facilités à une classe existante sans reprogrammer ou recompiler la classe de base. En utilisant les classes dérivées d’une classe existante, on définit une interface commune aux classes dérivées de telle manière que les objets de ces classes dérivées sont manipulés de façon identique par certaines parties du programme. Réutilisation INF1101 Algorithmes et structures de données
Principe d’héritage (suite) On peut ainsi utiliser l’héritage pour les besoins de généralisation, de réutilisation. La classe dérivée hérite des attributs et des fonctions de la classe de base. La classe dérivée est plus spécifique que la classe en ajoutant des attributs et des fonctions membres. INF1101 Algorithmes et structures de données
Principe d’héritage (suite) L’héritage est une relation « est un » Un commerce « est un » immeuble Une habitation « est un » immeuble Mais il est faux de dire : Un immeuble est un commerce Un immeuble est une habitation INF1101 Algorithmes et structures de données
Principe de composition La composition ou agrégation est une relation « possède un » Un immeuble possède une adresse, Un immeuble possède un point3D Il serait faux de concevoir le logiciel en énonçant que : Un immeuble est une adresse (Immeuble est dérivé d’Adresse) INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Autres relations La relation « utilise un » correspond à l’appel d’une fonction membre d’une classe dont un paramètre est un objet d’une autre classe. La relation « connaît un » correspond à une composition par adresse ou une association. INF1101 Algorithmes et structures de données
Principe d’héritage (suite) En C++, il existe l’héritage simple, et l’héritage multiple. Dans ce cours, nous ne nous intéresserons qu’à l’héritage simple. Dans la définition de la classe dérivée, afin d’utiliser l’héritage, on ajoute le symbole : après le nom de la classe en précisant par la suite quelle est la classe de base. Ex: class Sphere : public ObjetGeo {...} INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Les types d’attributs Les attributs private Lors de l’héritage public, les attributs privés de la classe de base restent privés pour les classes dérivées. Il faut donc utiliser les méthodes publiques de la classe de base afin d’accéder à ces attributs. INF1101 Algorithmes et structures de données
Les types d’attributs (suite) Les attributs ou méthodes publics Lors de l’héritage, Les attributs ou méthodes publics de la classe de base seront accessibles par les classes dérivées, et le resteront pour les clients de la classe dérivée. INF1101 Algorithmes et structures de données
Les types d’attributs (suite) Les attributs ou méthodes protected Lors de l’héritage: Les attributs protégés de la classe de base seront accessibles par les classes dérivées, mais ne seront pas accessibles par les clients de la classe dérivée. Ce type d’attribut est le plus utilisé lors de l’utilisation de l’héritage. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Accès aux membres class ObjetGeo { public: ObjetGeo(); ObjetGeo(couleur& maCouleur); ObjetGeo(const ObjetGeo &copie); virtual ~ObjetGeo(); protected: couleur maCouleur; }; INF1101 Algorithmes et structures de données
Redéfinition des fonctions de base Les fonctions de la classe de base peuvent être redéfinies dans la classe dérivée. Les fonctions redéfinies de la classe de base demeurent accessibles via l'opérateur de résolution de portée ("::"). INF1101 Algorithmes et structures de données
Exemple de redéfinition de fonctions de base Soit la classe ObjetGeo avec sa classe dérivée Cube, toutes les deux possédant une fonction Afficher(); ObjetGeo . . . Cube Afficher() . . . Afficher() INF1101 Algorithmes et structures de données
Redéfinition de fonctions void ObjetGeo::Afficher() { cout<<"Couleur"; maCouleur.ecrire(cout); cout<<endl; } void Cube::Afficher() { ObjetGeo::Afficher(); cout<< maHauteur <<maLongueur <<maLargeur; } Appel de la fonction Afficher() de ObjetGeo INF1101 Algorithmes et structures de données
Redéfinition de fonctions (suite) ObjetGeo MonObjet(couleur(100,0,0)); // fonction Afficher de ObjetGeo MonObjet.Afficher(); Cube MonCube (couleur(100,0,0),5,5,5); // fonction Afficher de Cube MonCube.Afficher(); MonCube.ObjetGeo::Afficher(); INF1101 Algorithmes et structures de données
Constructeur et destructeur Lors de la création d’un objet d’une classe dérivée, les constructeurs sont appelés dans l’ordre suivant: Les constructeurs des objets attributs de la classe de base, Le constructeur de la classe de base, Les constructeurs des objets attributs de la classe dérivée; Le constructeur de la classe dérivée. Les destructeurs sont appelés en ordre inverse des constructeurs. INF1101 Algorithmes et structures de données
La classe de base : ObjetGeo class ObjetGeo { public: ObjetGeo(); ObjetGeo(couleur& laCouleur); ObjetGeo(const ObjetGeo &copie); virtual ~ObjetGeo(); protected: couleur maCouleur; }; INF1101 Algorithmes et structures de données
Constructeur de ObjetGeo ObjetGeo::ObjetGeo(couleur& laCouleur) : maCouleur(laCouleur) { } INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Classe dérivée: Cube class Cube : public ObjetGeo { public: Cube(); Cube(couleur& col, float uneLargeur, float uneLongueur, float uneHauteur); Cube(const Cube &copie); ~Cube(); . . . private: float maLargeur; float maLongueur; float maHauteur; }; INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Constructeur de Cube Cube::Cube(couleur& col, float uneLargeur, float uneLongueur, float uneHauteur) :ObjetGeo(col) { maLargeur = uneLargeur; maLongueur = uneLongueur; maHauteur = uneHauteur; } INF1101 Algorithmes et structures de données
Ordre des appels de constructeurs et agrégat Lorsqu’un objet d’une classe dérivée est construit, une instance de la classe de base est automatiquement créée. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Méthodes non héritées Les classes dérivées n’héritent pas : Des constructeurs (défaut, paramètres, copie); Du destructeur; De l’opérateur d’affectation; Des relations d’amitié. INF1101 Algorithmes et structures de données
Opérateur d’assignation non hérité Si on a un opérateur= dans la classe de base; Si aucun opérateur= dans la classe dérivée; Alors, le compilateur va appeler l’opérateur= de la classe de base et recopie attribut par attribut les attributs de la classe dérivée. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Type d’héritage Il existe trois différents types d’héritage, soient : public, private et protected. Le type d’héritage est spécifié après le symbole : class Cylindre : private ObjetGeo Par défaut, le type d’héritage est privé. Dans ce cours, nous nous contenterons d’utiliser l’héritage public. INF1101 Algorithmes et structures de données
Type d’héritage (suite) Le type d’héritage permet de savoir : Quelles entités sont au courant qu’une certaine classe est en fait une classe dérivée d’une classe de base. Comment les attributs de la classe de base seront accessibles. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Héritage public class ClasseDerivee : public ClasseBase Classe de base Classe dérivée private protected public Les attributs private, protected et public de la classe de base restent les mêmes pour la classe dérivée. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Héritage protected class ClasseDerivee : protected ClasseBase Classe de base Classe dérivée private protected public Les attributs public de la classe de base deviennent protégés pour la classe dérivée. INF1101 Algorithmes et structures de données
INF1101 Algorithmes et structures de données Héritage privé class ClasseDerivee : private ClasseBase Classe de base Classe dérivée private protected public Tous les attributs de la classe de base deviennent private pour la classe dérivée. INF1101 Algorithmes et structures de données