OVH Cloud OVH Cloud

Le danger de l'utilisation du pointeur this avec des fonctions virtuelles !

1 réponse
Avatar
Marc
Bonjour,
je viens de lever un bug dans un programme qui me laisse perplexe.
En fait, je croyais que dans une classe donnée, this était un pointeur du
type de la classe. Mais ce n'est pas exactement le cas.
Exemple :

class A {

virtual const bool operator==(const A&) const {...}
virtual const bool operator!=(const A& x) const { return !(*this==x);}
// le danger est ici !

};

class B : public A {

virtual const bool operator==(const A& x) const {

const B *b=dynamic_cast<const B*>(&x);
if (!b) throw Exception("Erreur de type");
if (A::operator !=(*palier))
return false;
else
....}

virtual const bool operator!=(const A& x) const { return !(*this==x);}

};

Le problème, c'est que quand j'implémente ce modèle, si je teste l'égalité
de deux objets de type B, ça me déclenche une boucle sans fin, puisque
l'opérateur != de la classe A va rappeler l'opérateur == de la classe B qui
appelle l'opérateur != de la classe A, etc...
C'est vicieux, non ?
En fait, je trouve dangereux que le polymorphisme s'applique lors de
l'utilisation du pointeur this dans une classe de base!
Qu'en pensez-vous? Y a t-il une solution sans être chaque fois obligé de
qualifier l'opérateur (il y a un fort danger d'oubli ou d'erreur!).
Merci de vos lumières.
Marc

1 réponse

Avatar
Thomas Parle
"Marc" a écrit dans le message de news:
3fd83ce6$0$17114$
Bonjour,

En fait, je trouve dangereux que le polymorphisme s'applique lors de
l'utilisation du pointeur this dans une classe de base!


Ben ça me parait amha plutôt utile, au contraire.

Qu'en pensez-vous? Y a t-il une solution sans être chaque fois obligé de
qualifier l'opérateur (il y a un fort danger d'oubli ou d'erreur!).


Une solution pourrait être d'appeler explicitement des méthodes non
virtuelles du genre classA_equals(const A&) dans A et pareil dans B, dans
tes opérateurs == et != pour éviter le polymorphisme que tu ne désires pas.