Académique Documents
Professionnel Documents
Culture Documents
logiciels Autorisant la dfinition de nouvelles classes drives partir dune classe existante de base
Super-classe ou classe mre Sous-classe ou classe fille : spcialisation de la superclasse - hritage des proprits de la super-classe Possibilit dhritage multiple en C++
66
};
float prelev; public: void prelever(); ComptePrelevementAuto(long id, float pr, float so);
67
68
68
68
69
// Base() { a=0; }
class Derived : public Base { int b; public: Derived() : b(0) {} // appel implicite Base() Derived(int i, int j) : Base(i), b(j) {} // appel explicite };
69
class Derived : public Base { int b; public: Derived() : b(0) {} // appel implicite Base() Derived(int i, int j) : Base(i), b(j) {} // appel explicite };
69
class Derived : public Base { int b; public: Derived() : b(0) {} // appel implicite Base() Derived(int i, int j) : Base(i), b(j) {} // appel explicite }; Derived obj; construction dun objet de la classe Base puis dun objet de la classe Derived
Destruction de obj appel automatique au destructeur de la classe Derived puis celui de la classe Base (ordre inverse des constructeurs)
69
70
71
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
Rsultat :
1 1 1 3
72
ord=0) // constructeur usuel ; " << x << " " << y << endl ; constructeur de recopie ; " << x << " " << y << endl ;
73
ord=0) // constructeur usuel ; " << x << " " << y << endl ; constructeur de recopie ; " << x << " " << y << endl ;
Rappel : appel du constructeur par copie lors de linitialisation dun objet par un objet de mme type de la transmission de la valeur dun objet en argument ou en retour de fonction
73
74
Si pas de constructeur par copie dfini dans la sous-classe Appel du constructeur par copie par dfaut de la sous-classe et donc du constructeur par copie de la super-classe
74
int main() { void fct (pointcol) ; // Dclaration de f pointcol a (2,3,4) ; fct (a) ; // appel de fct avec a transmis par valeur }
75
int main() { void fct (pointcol) ; // Dclaration de f pointcol a (2,3,4) ; fct (a) ; // appel de fct avec a transmis par valeur }
Rsultat :
++ point 2 3 ++ pointcol 4 CR point 2 3 CR pointcol 4 *** entree dans fct *** 75
int main() { void fct (pointcol) ; // Dclaration de f pointcol a (2,3,4) ; fct (a) ; // appel de fct avec a transmis par valeur }
Rsultat :
++ point 2 3 pointcol a (2,3,4) ; ++ pointcol 4 CR point 2 3 CR pointcol 4 *** entree dans fct *** 75
int main() { void fct (pointcol) ; // Dclaration de f pointcol a (2,3,4) ; fct (a) ; // appel de fct avec a transmis par valeur }
Rsultat :
++ point 2 3 pointcol a (2,3,4) ; ++ pointcol 4 CR point 2 3 fct (a) ; CR pointcol 4 *** entree dans fct *** 75
B ( [const] B&)
76
B ( [const] B&)
Le constructeur par copie de la classe drive doit prendre en charge lintgralit de la recopie de lobjet et galement de sa partie hrite
76
77
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1() Classe2::Classe2(const Classe2&)
Appel du constructeur de la classe mre car pas dappel explicite au copy const. de la classe mre dans le copy const. de la classe fille
78
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
Rsultat :
Classe1::Classe1() Classe2::Classe2() Classe1::Classe1(const Classe1&) Classe2::Classe2(const Classe2&) 79
81
quivalent un membre priv pour les utilisateurs de la classe Comparable un membre public concepteur dune classe drive pour le
Mais comparable un membre priv pour les utilisateurs de la classe drive Possibilit de violer lencapsulation des donnes
82
quivalent un membre priv pour les utilisateurs de la classe Comparable un membre public concepteur dune classe drive pour le
83
84
nouveau statut accs aux fonctions accs un membres et amies de la utilisateur de la dans la classe drive classe drive classe drive
oui oui non oui non non public protected private
85
nouveau statut accs aux fonctions accs un membres et amies de la utilisateur de la dans la classe drive classe drive classe drive
oui oui non oui non non public protected private
Les fonctions ou classes amies de la classe de base ont accs tous les membres de la classe de base quils soient dfinis comme public, private ou protected 85
86
86
86
87
88
88
class Derivee : public Base { float a; // redfinition de lattribut a public : void affiche(); // redfinition de la mthode affiche float GetADelaClasseDerivee(){return a;} ; int GetADeLaClasseDeBase() {return Base::a;} };
90
class Derivee : public Base { float a; // redfinition de lattribut a public : void affiche(); // redfinition de la mthode affiche float GetADelaClasseDerivee(){return a;} ; int GetADeLaClasseDeBase() {return Base::a;} };
90
class Derivee : public Base { float a; // redfinition de lattribut a public : void affiche(); // redfinition de la mthode affiche float GetADelaClasseDerivee(){return a;} ; int GetADeLaClasseDeBase() {return Base::a;} };
90
class Derivee : public Base { float a; // redfinition de lattribut a public : void affiche(); // redfinition de la mthode affiche float GetADelaClasseDerivee(){return a;} ; int GetADeLaClasseDeBase() {return Base::a;} };
90
class Derivee : public Base { float a; // redfinition de lattribut a public : void affiche(); // redfinition de la mthode affiche float GetADelaClasseDerivee(){return a;} ; int GetADeLaClasseDeBase() {return Base::a;} };
90
91
91
91
91
91
91
91
91
91
92
Mmes autorisations daccs pour les fonctions amies dune classe drive que pour ses mthodes Pas dhritage au niveau des dclarations damiti
class A { friend class ClasseAmie; public: A(int n=0) : attributDeA(n) {} private: int attributDeA; }; class ClasseAmie { public: ClasseAmie(int n=0) : objetMembre(n) {} void affiche1() {cout << objetMembre.attributDeA << endl;} // OK: Cette classe est est amie de A private: A objetMembre; };
92
};
93
}; class ClasseDrive: public ClasseAmie { public: ClasseDrive(int x=0,int y=0): ClasseAmie(x), objetMembre2(y) {} void Ecrit() { cout << objetMembre2.attributDeA << endl; } // ERREUR: ClasseDrive n'est pas amie de A // error: `int A::attributDeA' is private private: A objetMembre2; };
93
94
Linverse nest pas possible : impossibilit de convertir une instance de la classe de base en instance de la classe drive
ClasseDeBase a; ClasseDrive b; a=b; // // b=a; // // lgal et appel de loprateur = de la classe de Base sil a t redfini ou de loprateur par dfaut sinon illgal error: no match for 'operator=' in b = a'
94
// Possible mais Attention les attributs membres // de la classe drive nauront pas de valeur
95
= de la classe drive
96
97
98
98
99
operateur = de pointcol
99
100
100
101
101
103
104
// classe drive de deux autres classes class PointCouleur : public Point, public Couleur { ...
};
104
// classe drive de deux autres classes class PointCouleur : public Point, public Couleur { ... // Constructeur PointCouleur (...) : Point(...), Couleur(...) };
104
// classe drive de deux autres classes class PointCouleur : public Point, public Couleur { ... // Constructeur PointCouleur (...) : Point(...), Couleur(...) void affiche(){Point::affiche(); Couleur::affiche(); }
};
104
105
105
Si affiche() na pas t redfinie dans PointCouleur : error: request for member `affiche' is ambiguous error: candidates are: void Couleur::affiche() void Point::affiche()
105
<< endl;
115
116
116
116
int main() { Personne * p1 = new Etudiant("GAMOTTE","Albert",34,'M',13); p1->Affiche(); Personne::Personne(GAMOTTE,Albert,34,M) delete p1; Etudiant::Etudiant(GAMOTTE,Albert,34,M,13) } Monsieur Albert GAMOTTE ag de 34 ans. Personne::~Personne()
116
<< endl;
117
<< endl;
117
Personne::Personne(GAMOTTE,Albert,34,M) Etudiant::Etudiant(GAMOTTE,Albert,34,M,13) Monsieur Albert GAMOTTE ag de 34 ans. Il s'agit d'un tudiant ayant pour note :13. Etudiant::~Etudiant() Personne::~Personne()
118
Toujours dclarer virtuel le destructeur dune classe de base destine tre drive pour sassurer que une libration complte de la mmoire Pas dobligation de redfinir une mthode virtuelle dans les classes drives Possibilit de redfinir une mthode virtuelle dune classe de base, par une mthode virtuelle ou non virtuelle dans une classe drive Ncessit de respecter le prototype de la mthode virtuelle redfinie dans une classe drive (mme argument et mme type retour) 119
120
121
: " << typeid (adp).name() << endl ; : " << typeid (*adp).name() << endl ; : " << typeid (adp).name() << endl ; : " << typeid (*adp).name() << endl ;
121
122
En A : les objets pointes par adp1 et adp2 sont de meme type En B : les objets pointes par adp1 et adp2 sont de type different
122