Bonjour.
J'ai constaté un comportement du compilateur que je ne comprends pas trop.
Voici un résumé :
- j'ai une classe D (données) dont l'unique constructeur public a besoin d'une string
- j'ai une classe de base A qui implémente plusieurs versions d'une fonction f()
- j'ai une classe B qui dérive de A et qui implemente une version de f() prenant en argument une référence de classe D
Ca donne ça :
Code :
- /* La classe stockant des données */
- class D
- {
- public: D(const ::std::string& );
- virtual ~D();
- private:
- D();
- D(const D& );
- };
- /* Classe de base */
- class A
- {
- public: A();
- virtual ~A();
- protected: void f(int);
- void f(char);
- void f(const ::std::string& );
- };
- /* Classe specialisee */
- class B : public A
- {
- public: B();
- virtual ~B();
- void toto();
- protected: void f(const D& );
- };
|
Ce que je ne comprends pas, c'est ce que fait le compilateur lorsque depuis l'une des méthodes de la classe spécialisée B, j'appelle f() avec une string en argument :
Code :
- void B::toto()
- {
- ::std::string s("bonjour" );
- f(s);
- }
|
Là le compilateur construit un objet intermédiaire D et appelle B::f(const D& ).
Pourquoi ne va-t-il pas chercher directement la méthode A::f(const ::std::string& ) ????
Si je déclare le constructeur D :: D(const ::std::string& ) explicit, ça ne compile plus, car il ne trouve aucun constructeur adapté pour son objet intermédiaire (normal). Au moins ça me permet de déctecter mon problème.
Testé avec gcc et vc++.
Merci de vos lumières et désolé d'exposer ici mes lacunes en c++ !
[EDIT : oubli de faire dériver B de A]
Message édité par f4brice le 14-09-2007 à 09:48:27