Template, héritage et polymorphisme
Bonjour,
J'ai un petit souci avec un code C++, une petite question d'héritage avec utilisation de template à la base, mais qui me fait soulever une autre question.
Le code source est en pièce jointe.
Voici la situation. Ce code fourni 2 implémentations qui sont, a priori, identiques du point de vue fonctionnelle, une utilisant des templates, et l'autre non. On peut passer de l'une à l'autre en commentant la définition #define WITH_TEMPLATE.
Le 1er problème que je rencontre est que ces deux implémentations, a priori identique, ne se comporte pas de la même manière à la compilation : l'une passe (cell utilisant les templates), et l'autre provoque l'erreur suivante
Citation:
test.cxx: Dans function « int main(int, char**) »:
test.cxx:53: error: no matching function for call to `Base::method(Foo*&)'
test.cxx:24: error: candidates are: virtual bool Base::method(const Foo*&)
Pour moi, cette erreur semble normal, puisque j'essai de faire une conversion entre un Foo*& en un const Foo*&.
2ème problème, mais qui sans doute lié au premier, est que la version avec template, qui compile correctement, s'exécute... sans polymorphisme ! Alors qu'il devrait. Et affiche donc "Base: method" au lieu de "Child: method".
Ne voyant pas le problème, j'appelle à l'aide. Si certains d'entre vous ont des idées là-dessus.
Dernière chose, j'ai testé les compilateurs g++-3.3.6, g++-4.3.2 ainsi que le compilateur Comeau en ligne, et tous donne les même résultats à la compilation, donc je pense que l'on peut écarter un bug du compilo...
Mon code
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| //#define WITH_TEMPLATE
#include <iostream>
using namespace std;
class Foo
{
};
#define OBJECT Foo*
#ifdef WITH_TEMPLATE
template<class T_Object>
#else
#define T_Object OBJECT
#endif
class Base
{
public:
virtual bool method(const T_Object& obj)
{
cout << "Base: method" << endl;
}
};
#ifdef WITH_TEMPLATE
class Child : public Base<OBJECT>
#else
class Child : public Base
#endif
{
public:
bool method(const OBJECT& obj)
{
cout << "Child: method" << endl;
}
};
int main(int argc, char** argv)
{
#ifdef WITH_TEMPLATE
Base<OBJECT> *b;
#else
Base *b;
#endif
OBJECT f;
Child c;
b = &c;
b->method(f);
return 0;
} |
Merci d'avance.