-->
Classes, HéritageDé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) |