Partie 13: Héritage Multiple — Programmation orientée objet en C++
Upcoming SlideShare
Loading in...5
×
 

Partie 13: Héritage Multiple — Programmation orientée objet en C++

on

  • 1,534 views

Support material for a continued education course "Introduction to object oriented programming in C++".

Support material for a continued education course "Introduction to object oriented programming in C++".
In French.

Statistics

Views

Total Views
1,534
Views on SlideShare
1,534
Embed Views
0

Actions

Likes
0
Downloads
73
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Partie 13: Héritage Multiple — Programmation orientée objet en C++ Partie 13: Héritage Multiple — Programmation orientée objet en C++ Presentation Transcript

  • Programmation Orientée Objet en C++ 13ème Partie: Héritage Multiple Fabio Hernandez Fabio.Hernandez@in2p3.fr
  • Vue dEnsemble Notions de base Types, variables, opérateurs Contrôle dexécution Fonctions Mémoire dynamique Qualité du logiciel Evolution du modèle objet Objets et classes Fonctions membres Classes génériques Héritage Polymorphisme Héritage multiple Entrée/sortiePOO en C++: Héritage Multiple 449 © 1997-2003 Fabio HERNANDEZ
  • Table des Matières Motivation Exemple Héritage et Ambiguïté Héritage Répété RésuméPOO en C++: Héritage Multiple 450 © 1997-2003 Fabio HERNANDEZ
  • Motivation Nous avons étudié lhéritage comme un mécanisme permettant dexprimer les caractéristiques et le comportement communs existants dans des groupes de structures similaires mais aussi leurs spécificités Les exemples présentés illustraient le cas de lhéritage simple: une classe héritant dune seule classe de base Contrairement à dautres langages OO, C++ offre la possibilité à une classe dhériter de plusieurs classes de base Ce mécanisme est appelé héritage multiplePOO en C++: Héritage Multiple 451 © 1997-2003 Fabio HERNANDEZ
  • Motivation (suite) Figure OpenFigure ClosedFigure Segment Polyline Polygon Ellipse Triangle Rectangle ... Circle SquarePOO en C++: Héritage Multiple 452 © 1997-2003 Fabio HERNANDEZ
  • Motivation (suite) Les caractéristiques dune figure "dessinable" peuvent être modélisées comme une classe Drawable color_: Color lineType_: LineType lineThickness_: LineThickness draw: bool setColor:bool getColor: Color setLineType: bool getLineType: LineType setLineThickness: bool getLineThickness: LineThicknessPOO en C++: Héritage Multiple 453 © 1997-2003 Fabio HERNANDEZ
  • Motivation (suite) Un polygone dessinable peut hériter de deux classes Drawable Polygon DrawablePolygonPOO en C++: Héritage Multiple 454 © 1997-2003 Fabio HERNANDEZ
  • Contrôle dAvancement Motivation Exemple Héritage et Ambiguïté Héritage Répété RésuméPOO en C++: Héritage Multiple 455 © 1997-2003 Fabio HERNANDEZ
  • Classe Drawable class Drawable { public: // Constructors/Destructor Drawable(Color color, LineType type); virtual ~Drawable(); // Modifiers virtual bool draw() = 0; bool setColor(Color color); bool setLineType(LineType type); bool setLineThickness(LineThickness thickness);POO en C++: Héritage Multiple 456 © 1997-2003 Fabio HERNANDEZ
  • Classe Drawable (suite) // Selectors LineType getLineType() const; LineThickness getLineThickness() const; Color getColor() const; private: // Data members Color color_; LineType lineType_; LineThickness lineThickness_; };POO en C++: Héritage Multiple 457 © 1997-2003 Fabio HERNANDEZ
  • Rappel: Classe Rectangle class Rectangle : public Polygon { public: // Constructors/Destructor Rectangle(const Point& origin, float side1, float side2); virtual ~Rectangle(); // Modifiers virtual void translate(float horizontal, float vertical); virtual void rotate(float angle); ...POO en C++: Héritage Multiple 458 © 1997-2003 Fabio HERNANDEZ
  • Rappel: Classe Rectangle (suite) // Selectors virtual float perimeter() const; virtual float area() const; virtual bool isInside(const Point& aPoint) const; float diagonal() const; ... private: // Data members float side1_; float side2_; Point origin_; };POO en C++: Héritage Multiple 459 © 1997-2003 Fabio HERNANDEZ
  • Classe DrawableRectangle class DrawableRectangle : public Rectangle, public Drawable { public: Héritage de deux // Constructors/Destructor classes de base DrawableRectangle(const Point& origin, float side1, float side2); virtual ~DrawableRectangle(); // Modifiers virtual bool draw(); };POO en C++: Héritage Multiple 460 © 1997-2003 Fabio HERNANDEZ
  • DrawableRectangle : implémentation Limplémentation du constructeur serait DrawableRectangle::DrawableRectangle(const Point& origin, float side1, float side2) : Rectangle(origin, side1, side2), Drawable(Red, Solid) { // Nothing more to do } Appel aux constructeur des classes de base, avec les arguments nécessairesPOO en C++: Héritage Multiple 461 © 1997-2003 Fabio HERNANDEZ
  • DrawableRectangle : implémentation (suite) Les constructeurs des classes de base sont appelés avant le constructeur de la classe dérivée, dans lordre de déclaration des classes de base dans linterface de la classe, et ce indépendamment de la liste dinitialisation dabord le constructeur de Rectangle et après celui de Drawable dans cet exemple Dans la liste dinitialisation, il nest pas nécessaire de spécifier le constructeur dune classe de base qui ne définit pas un constructeur ou qui en définit un par défaut Une classe de base doit être initialisée avec la liste darguments attendue par son constructeur Les destructeurs des classes de base sont appelés dans lordre inverse de celui des constructeursPOO en C++: Héritage Multiple 462 © 1997-2003 Fabio HERNANDEZ
  • DrawableRectangle : implémentation (suite) Nous devons fournir une implémentation pour la méthode abstraite draw bool DrawableRectangle::draw() { // Do whatever is necessary to draw a rectangle. // Here we can use inherited methods getColor(), // getLineType(), etc. }POO en C++: Héritage Multiple 463 © 1997-2003 Fabio HERNANDEZ
  • DrawableRectangle : utilisation Les objets de cette classe offrent les services hérités de deux classes de base DrawableRectangle drect(Point(10.0, 45.0), 14.0, 15.0); // Compute its perimeter float perimeter = drect.perimeter(); // Rectangle::perimeter // Change its color and draw it drect.setColor(Green); // Drawable::setColor drect.draw(); // Drawable::drawPOO en C++: Héritage Multiple 464 © 1997-2003 Fabio HERNANDEZ
  • Contrôle dAvancement Motivation Exemple Héritage et Ambiguïté Héritage Répété RésuméPOO en C++: Héritage Multiple 465 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté Une classe dans une hiérarchie de classes peut hériter deux ou plusieurs méthodes ou attributs avec la même signature class Base1 { public: // Constructors/Destructor ... // Selectors void print() const; private: // Data members ... };POO en C++: Héritage Multiple 466 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté (suite) class Base2 { public: // Constructors/Destructor ... // Selectors void print() const; private: // Data members ... };POO en C++: Héritage Multiple 467 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté (suite) class Derived: public Base1, public Base2 { public: // Constructors/Destructor ... // Selectors ... private: // Data members ... };POO en C++: Héritage Multiple 468 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté (suite) Le compilateur signale une erreur lorsquil ne peut pas lever lambiguïté Derived d; d.print(); // ERROR: Base1::print() or Base2::print() ? Cest au programmeur de spécifier sans ambiguïté la méthode souhaitée Deux façons avec lopérateur de portée d.Base1::print(); // OK: Base1::print() is called en définissant la méthode Derived::print()POO en C++: Héritage Multiple 469 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté (suite) class Derived: public Base1, public Base2 { public: // Constructors/Destructor ... // Selectors Cache Base1::print() void print() const; et Base2::print() private: // Data members ... };POO en C++: Héritage Multiple 470 © 1997-2003 Fabio HERNANDEZ
  • Héritage et Ambiguïté (suite) Il ny a plus dambiguïté Derived d; d.print(); // OK: Derived::print() is called Limplémentation de Derived::print() peut utiliser la méthode print() des classes de base void Derived::print() const { Base1::print(); Base2::print(); }POO en C++: Héritage Multiple 471 © 1997-2003 Fabio HERNANDEZ
  • Contrôle dAvancement Motivation Exemple Héritage et Ambiguïté Héritage Répété RésuméPOO en C++: Héritage Multiple 472 © 1997-2003 Fabio HERNANDEZ
  • Héritage Répété Dans certains cas, une classe peut hériter plus dune fois dune même classe de base dans une hiérarchie Employee Teacher Student TeachingAssistantPOO en C++: Héritage Multiple 473 © 1997-2003 Fabio HERNANDEZ
  • Héritage Répété (suite) class Employee { ... }; class Teacher: public Employee { ... }; class Student: public Employee { ... }; class TeachingAssistant: public Teacher, public Student { ... }; Un objet de la classe TeachingAssistant contiendra deux fois les données héritées de la classe Employee: une fois par lhéritage de la classe Teacher et une autre par la classe StudentPOO en C++: Héritage Multiple 474 © 1997-2003 Fabio HERNANDEZ
  • Héritage Répété (suite) Il est possible de navoir quune occurrence des membres de la classe de base, en utilisant lhéritage virtuel class Employee { ... }; class Teacher: virtual public Employee { ... }; class Student: virtual public Employee { ... }; class TeachingAssistant: public Teacher, public Student { ... }; Une seule occurrence des données de la classe Employee dans TeachingAssistantPOO en C++: Héritage Multiple 475 © 1997-2003 Fabio HERNANDEZ
  • Contrôle dAvancement Motivation Exemple Héritage et Ambiguïté Héritage Répété RésuméPOO en C++: Héritage Multiple 476 © 1997-2003 Fabio HERNANDEZ
  • Résumé Contrairement à dautres langages OO, en C++ une classe peut hériter directement de plusieurs classe de base Lhéritage peut provoquer des ambiguïtés qui doivent être levées par le programmeur Lhéritage virtuel permet de navoir quune seule occurrence dune classe de base dans une classe dérivée, en présence dhéritage répétéPOO en C++: Héritage Multiple 477 © 1997-2003 Fabio HERNANDEZ