Heritage et surdéfinition... - C++ - Programmation
Marsh Posté le 14-09-2007 à 09:47:46
Oups, c'est une erreur quand j'ai écrit le message. Je l'édite...
Marsh Posté le 14-09-2007 à 11:22:53
Salut,
Il faut utiliser un using pour importer les méthodes de la classe de base pour lesquelles tu fais une surcharge. J'essaie de retrouver un lien expliquant ça, et j'édite mon post.
Edit: voilà: http://www.parashift.com/c++-faq-l [...] l#faq-23.9
Marsh Posté le 14-09-2007 à 12:17:24
La FAQ te dit comment t'en sortir et suggères surtout d'éviter les mélanges.
Sinon c'est bien beau de cacher son constructeur de copie, seulement, faudrait aussi cacher operator=
Marsh Posté le 14-09-2007 à 18:09:05
IrmatDen : merci pour ton lien. J'en sais un peu plus maintenant et l'astuce du "using" permet d'adresser mon problème.
Taz : tu as raison ; je pense rarement à le faire.
Marsh Posté le 14-09-2007 à 19:09:44
Taz a écrit : La FAQ te dit comment t'en sortir et suggères surtout d'éviter les mélanges. |
ou mieux, dériver de boost::non_copyable
Marsh Posté le 14-09-2007 à 08:30:15
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 :
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 :
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