Problème surcharge operator= C++
cyberlulu
Messages postés
62
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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
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
A voir également:
- Problème surcharge operator= C++
- Surcharge antenne - Forum TNT / Satellite / Réception
- Surcharge lnb - Forum TNT / Satellite / Réception
- Court circuit LNB - Forum TNT / Satellite / Réception
- Operator openai - Accueil - Intelligence artificielle
- Surcharge du circuit LNB - Forum TNT / Satellite / Réception
2 réponses
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);
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);
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.
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.
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...