Salut
C'est amusant comme parfois, les réponses anticipes les questions : Herb Sutter à justement abordé en détail ta problématique dans le GOTW 5 de la semaine dernière : http://herbsutter.com/2013/05/22/got...ual-functions/
Regarde en particulier la partie Interlude et les définitions de override (redéfinition), overload (surcharge) et hide (masquage).
Ce que tu fais n'est ni une surcharge (les deux fonctions compare ne sont pas dans la même portée), ni une redéfinition (les deux fonctions n'ont pas les mêmes paramètres). C'est donc un masquage
Ensuite, c'est un problème de type dynamique et statique. Ta variable a1 est de type statique A et n'as pas de redéfinition (pas de fonction virtuelle correspondant pour le type dynamique de a1, qui est le type B) de la fonction compare, donc c'est bien A::compare qui est appelé
Si tu veux appeler B::compare, soit tu utilises le type statique B :
static_cast<B*>(a1)->compare(*static_cast<B*>(a2));
soit tu changes la signature de B::compare pour bénéficier de la redéfinition :
1 2 3 4 5
| class B : public A
{
public:
void compare(A const& b) { std::cout << "B"; }
}; |
HS : utilise const& si tu ne modifies pas tes paramètres de fonctions
Bon courage
Partager