Problème surcharge operator= C++

Fermé
cyberlulu Messages postés 62 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 26 juin 2008 - 26 juin 2008 à 11:36
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 26 juin 2008 à 14:07
Bonjour,

Voici mon problème au niveau de la surcharge de l'opérateur =.
J'ai une classe B qui hérite publiquement de A.
Dans la classe A, je définis l'opérator=. Je fais de même dans la classe B.
Dans mon code, j'écris :
A *objet1 = new B;
A *objet2 = new B;

à un moment je fais *objet1 = *objet2.

Mon problème est que l'affectation ne se fait qu'en passant dans operator= de la classe A et pas la B. Ce que je voudrais c'est que l'affectation détecte que j'ai des objets de type B et que mon exécution passe dans l'operator= de B et que dans cet operator= de B je fasse appel à celui de A au début.

Comment est-ce que je peux faire pour avoir ce résultat.

Merci d'avance

2 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 juin 2008 à 12:21
8-/
objet1 est de type A, comment veux tu qu'il aille chercher un membre de la classe B ??
Ce que tu demande est tout simplement impossible, comment le compilateur peux deviner ?
Tu peux faire un typage sauvage :
*(B*)objet1=*objet2;
là, il devrais appeler la méthode B::opertor=(A).
As tu bien défini operator= virtuel ?
si oui, essai objet1->operator=(*objet2);
0
cyberlulu Messages postés 62 Date d'inscription dimanche 10 novembre 2002 Statut Membre Dernière intervention 26 juin 2008
26 juin 2008 à 13:53
euh... ben non mon objet 1 est de type B, je fais bien : A *objet = new B; comme pour l'objet2. ils sont tous les deux de même type.
et sinon la méthode operator= est bien en virtuelle. J'ai d'ailleurs fait le test avec une autre méthode et ca fonctionne sans problème, mais pas pour l'operator=.
donc si qqun a une idée...
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 juin 2008 à 14:07
Non, objet1 est de type A* !
A*objet1=new B;
veux dire que tu déclare une variable de nom "objet1" qui est un pointeur sur une classe de type A !
Et ensuite, tu fait pointé objet1 sur une classe de type B (new B).
donc, *objet1 est vu par le compilateur comme étant de type A et non de type B.
Ensuite, par dessus, il y a le polymorphisme qui viens se greffer dessus. Lorsque tu as un pointeur de classe et que tu appel une méthode, si celle ci est virtuelle, il regarde dans la v-table quelle fonction utiliser.
D'un autre coté, tu fait *obj1=*obj2. Mettons qu'il comprenne le polymorphisme dans ce cas là (à vérifier, pour moi le compilo voi : A.operator=(A)) il va alors chercher à trouver la méthode B::operator=(A); si celle-ci n'est pas défini il va chercher dans la classe mère, à savoir A, A::operator=(A), qu'il va trouver.
D'un autre coté, comme tu ne mets pas le code source, je ne fait que des hypothèses.
Met au moins la déclaration des classes.
D'un autre coté, je ne comprends pas pourquoi tu met du B dans du A. autant mettre du B dans du B. La démarche se comprends si tu fait :
A** objet=new A*[N];
objet[0]=new B;
objet[1]=new A;
c'est à dire si tu utilise le polymorphisme.
0