--> Classes, Héritage
| Définition et rôle |
| Ex : | 2-roues dérivée-de véhicule, |
| rectangle dérivée-de figure |
| Classe dérivée |
| Dérivation |
| class nom : á liste_de_dérivation ñ |
| { |
| // ... |
| }; |
| Dérivation : exemple (1) |
| class figure { | |
| protected : | |
| Point position ; | |
| public : | |
| void translater(const int, const int) ; | |
| void afficher(void) const ; | |
| // ... | |
| } ; | |
| class rectangle : public figure { | |
| // Ajout d'attributs | |
| int largeur, hauteur; | |
| public : | |
| // constructeur de rectangle | |
| rectangle(int i=0, int j=0) : | |
| largeur(i), hauteur(j) {} | |
| // ajout de méthode | |
| int diagonale(void) const ; | |
| // redéfinition de méthode | |
| void afficher(void) const ; | |
| // translater() n'est pas redéfinie | |
| // ... | |
| } ; |
| Dérivation : exemple (2) |
| membres | position |
| hérités de figure | translater(const int, const int) |
| figure::afficher() | |
| largeur | |
| membres spécifiques | hauteur |
| à rectangle | diagonale() |
| afficher() |
| rectangle rect(5,10); |
| // appel ``afficher'' de la classe ``rectangle'' |
| rect.afficher(); |
| // appel ``afficher'' de la classe ``figure'' |
| rect.figure::afficher(); |
| rect.translater(); |
| Dérivation et droits d'accès |
| Accès aux membres (1) |
| Redéfinition des membres (1) |
--> utiliser Base::nom_membre pour y
accéder.
| Redéfinition des membres : exemple (1) |
| class Auto { |
| public: |
| Auto(int x) : poids(x) {} |
| void setpoids(int x) { poids=x; } |
| int getpoids(void) { return poids; } |
| // ... |
| private: |
| int poids; |
| // ... |
| }; |
| class Camion : public Auto { |
| private: |
| int remorque; // poids de la remorque |
| // ... |
| public: |
| Camion(int x, int y) : Auto(x), remorque(y) {} |
| void setpoids(int, int); |
| int getpoids(void); |
| // ... |
| }; |
| Redéfinition des membres : exemple (2) |
| void Camion::setpoids(int x, int y) { |
| // setpoids masque setpoids de Auto |
| // Accès à setpoids de Auto par : |
| Auto::setpoids(x); |
| remorque = y; |
| } |
| int Camion::getpoids(void) { |
| // Accès à getpoids de Auto |
| return Auto::getpoids()+remorque; |
| } |
| Types de dérivation (1) |
--> Rappel : quel que soit le type de dérivation, les
membres privés de Base ne sont pas accessibles dans Deriv.| Types de dérivation (2) |
| Types de dérivation (3) |
| class String { | |
| private: | |
| void foo(); | |
| public: | |
| // ... | |
| int length() const ; | |
| void yafoo(); | |
| }; | |
| class Nom : private String { | |
| public: | |
| // ... | |
| String::length; // déclaration d'accès | |
| // (ni type ni signature) | |
| protected: | |
| String::yafoo; | |
| String::foo ; // ERREUR : le droit d'accès | |
| // à foo ne peut pas être augmenté !!! | |
| }; |
| Dérivation et conversion (1) |
-> Base est
toujours possible.
| void fonc(figure); |
| rectangle rect ; |
| // Exples de conversion automatique |
// de rectangle -> figure |
| figure f = rect ; |
| figure *ptFig = &rect ; |
| figure& ptFig = rect ; |
| fonc(rect); |
--> conversion réciproque (Base -> Deriv) automatique seulement s'il existe un constructeur
Deriv::Deriv(const Base&) -> Base seulement
dans la portée de Deriv.
| Dérivation et conversion (2) |
| // class Camion : public Auto { } ; | |
| Auto a(900); | |
| Camion c(1200,130); | |
| a = c; // ok | |
| // si pas d'opérateur de conversion | |
| // d'une classe de base en une classe | |
| dérivée : Camion(Auto&) | |
| c = a; // erreur | |
| // conversion implicite | |
| Auto *aptr = &c; | |
| cout << aptr->getpoids(); // Auto::getpoids | |
| // conversion explicite | |
| Camion *cptr = (Camion *) aptr; | |
| cout << cptr->getpoids(); // Camion::getpoids |
| Dérivation et constructeurs |
| Dérivation et destructeurs |
| Dérivation et opérateurs |
| class Base { ... | |||
| public: | |||
| Base& operator++(); | |||
| }; | |||
| class Deriv : public Base {...}; | |||
| ... | |||
| Deriv d1, d2; | |||
| d2 = ++d1 ; // Erreur : ++d1 retourne | |||
| // un Base& |
| Dérivation et amitié |
| class A { |
| int a; |
| //... |
| friend class C; |
| }; |
| class D : public C { |
| void f(A* p) { p->a++; } // Erreur |
| }; |
| Héritage multiple |
| Classe de base virtuelle (1) |
| class Deriv1 : public Base {...}; , |
| class Deriv2 : public Base {...}; |
| class Fille :public Deriv1,public Deriv2 {...}; |
| class Deriv1 : virtual public Base {...}; |
| class Deriv2 : virtual public Base {...}; |
| class Fille:public Deriv1,public Deriv2 {..}; |
| Classe de base virtuelle (2) |