Opérateur, héritage et liaison dynamique
Hello
J'ai actuellement un soucis avec gcc. Je suis pas un pro C++, je viens plutot du monde JAVA, alors pardonnez moi si je divague.
Bref, je m'explique.
J'ai 1 classe mère, mettons M, et deux classes qui héritent en public de M, mettons Ma et Mb.
M défini un operateur == avec en paramètre M.
Je voudrais pouvoir surcharger cet opérateur dans Ma, de tel façon que si le second oprande est de type Ma on utilise l'opérateur == de Ma, et celui de M sinon.
En gros pour résumer :
Code:
1 2 3 4 5 6 7
| M m1;
Ma ma1,ma2;
Mb mb1;
ma1 == ma2; // utilise l'opérateur Ma::operator==
ma1 == m1; // utilise l'opérateur M::operator==
ma1 == mb1; // utilise l'opérateur M::operator== (car Mb est un sous type de M). |
La défnition des classes ci dessus expliquée serait la suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class M {
public:
M() {}
;
virtual ~M(){};
virtual bool operator==(M m) {
std::cout <<" M::operator=="<<std::endl;
return true;
};
};
class Ma : public M{
public:
Ma() {}
;
virtual ~Ma(){};
virtual bool operator==(Ma m) {
std::cout <<" Ma::operator=="<<std::endl;
return true;
};
};
class Mb : public M{
public:
Mb() {}
;
}; |
Tout cela est plutot simple.
Sauf que si je fais le test :
Code:
1 2 3 4 5
|
Ma ma1;
Mb mb1;
ma1==mb1 |
je me retrouve avec une erreur de compil :
Code:
1 2
| src/test/testMisc.cpp:101: error: no match for 'operator==' in 'ma1 == mb1'
src/test/testMisc.cpp:40: note: candidates are: virtual bool Ma::operator==(Ma) |
Il semblerait donc que la liaison dynamique ne marche pas en C++?
Encore plus étonnant :
Je fais un copier coller de la définiton de l'opérateur
Code:
1 2 3 4
| virtual bool operator==(M m) {
std::cout <<" M::operator=="<<std::endl;
return true;
}; |
de la classe M vers la classe Ma (qui défini donc ==(Ma) et ==(M)).
Et la ca passe...
J'avoue êrte un peu perdu...
Quelqu'un pour éclairer ma lanterne?
D'avance merci.