c++ , classes et heritage

c++ , classes et heritage - C++ - Programmation

Marsh Posté le 07-02-2003 à 16:51:34    

voila, jai une class B qui herite de A :
 

Code :
  1. class A{
  2. public :
  3. A();
  4. A(int ,int ,char *);
  5.     A& operator =(A&);
  6. A(A&);
  7. ~A();
  8. friend ostream& operator <<(ostream&, A&);
  9. private:
  10. int entier1;
  11. protected:
  12. int entier2;
  13. char *p_char1;
  14. };
  15. class B: public A{
  16. public :
  17. B();
  18. B(B&);
  19. B(int ,char *);
  20. B(int,int,char *);
  21. ~B();
  22. B& operator =(B&);
  23. bool operator == (B&);
  24. friend ostream& operator <<(ostream&, B&);
  25. private:
  26. int entier3;
  27. char *p_char2;
  28. };


lors de lappel a la fonction = pour recopier le contenu d'un objet de type B vers B, j'ai ajouter une ligne pour recopier aussi A (puisque B en herite) :
 
 

Code :
  1. B& B :: operator =(B& b)
  2. {
  3. cout << " ->  Appel a l'op = surdef, passage d'un objet de la classe B" << endl;
  4. cout << endl;
  5.         (A)(*this) = (A)b; // voici la commande qui ne marche pas :-(
  6. entier3 = b.entier3;
  7. strcpy(p_char2,b.p_char2);
  8. return(*this);
  9. };
  10. A& A :: operator =(A& a)
  11. {
  12. cout << " ->  Appel a l'op = surdef, passage d'un objet de la classe A" << endl;
  13. entier1 = a.entier1;
  14. entier2 = a.entier2;
  15. strcpy(p_char1,a.p_char1);
  16. return(*this);
  17. };


 
 
l'appel au l'op = du A est bel et bien appelle mais le contenu de A reste inchangé
 
 
B x;
B y;
 
y = x;


Message édité par red faction le 07-02-2003 à 16:59:37
Reply

Marsh Posté le 07-02-2003 à 16:51:34   

Reply

Marsh Posté le 07-02-2003 à 18:55:31    

:wahoo:

Reply

Marsh Posté le 07-02-2003 à 19:38:21    

remplace ton (A)(*this) = (A)b par  

Code :
  1. A:: operator = (static_cast <const A &> (b));


 
Sinon, attention quand tu fais  strcpy(p_char2,b.p_char2), si les 2 chaines ne sont pas de meme taille, tu vas avoir des problèmes.
De manière générale, il vaut mieux écrire les opérateurs d'affectation ainsi:
 

Code :
  1. Type &operator = (const Type &t)
  2. {
  3.    if (this != t)
  4.    {
  5.      /* copie */
  6.    }
  7.    return *this;
  8. }


ca évite les problèmes liés à l'autoaffectation (a=a) quand tu manipules des pointeurs.


Message édité par gloop le 07-02-2003 à 19:38:57
Reply

Marsh Posté le 07-02-2003 à 20:22:06    

merci ca marche now  :)

Reply

Marsh Posté le 10-02-2003 à 11:06:34    

Attention, tu risques d'avoir des problèmes mémoire lors des désallocations, et des surprises si tu ajoutes des fonctions membres dans A que tu redéfinis dans B : il faut déclarer tout ça virtuel (dans A).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed