GNT sans publicité, site mobile, fonctionnalitées exclusives...

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

Le
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
Lire la réponse

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thomas Parle
Le #137073
"Marc" 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.

Publicité
Suivre les réponses
Poster une réponse
Anonyme