Polymorphisme et static_cast - C++ - Programmation
Marsh Posté le 21-08-2013 à 17:51:22
Non, c'est illégal de faire un static cast dans ton cas.
dynamic cast te retourne nullptr parce que l'instance que tu manipules n'est pas de la classe dans laquelle tu convertis.
Edit : si tu faisais I *pI = new Fille(); tout le reste serait légal et fonctionnerait.
Marsh Posté le 21-08-2013 à 17:59:30
Arf!
Je me doute bien mais pour garder une certaine modularité je ne voudrai pas toucher à "I *pI = new Base();".
Comment faire (proprement) pour convertir ça vers le type de mon choix (du moment qu'il hérite de Base) ?
Edit: Et si je bricole une factory à base de template pour specifier le type que je veux creer avec new ?
Code :
|
Et que dans mon main je puisse faire
Code :
|
Marsh Posté le 21-08-2013 à 18:30:03
tu ne peux pas ...
Si la classe instanciée est au-dessus de toi, tu ne peux pas magiquement la convertir dans un type qui en dérive. Fin de l'histoire.
Si tu ne peux pas changer le type instancié, c'est perdu ... Mais je doute que ce soit vraiment le cas, non ? Pourquoi est-ce que tu te refuses à instancier directement une classe fille ?
j'aurais du lire avec le doigt.
oui tu peux faire ca, et c'est effectivement un pattern classique.
En général, tu vas donner une forme d'identifiant pour décrire la classe à instancier.
Chaque classe devra avoir été au préalable enregistrée dans ta factory
Marsh Posté le 21-08-2013 à 18:50:09
En réalité j'utilise une class "Server" avec un membre "Client *createClient()" qui me sort un pointeur vers un objet Client à chaque fois que je l'appelle.
Ce membre ne fait rien d'autre que faire un "new Client(...)" en passant les bons parametres et en settant les différents champs de Client (qui à Server en "friend" ).
Maintenant je voudrai surcharger Client pour lui ajouter de nouvelles fonctionnalités mais continuer à faire en sorte que ce soit "Server" qui me crée les objets. En revanche "Server" ne peut pas avoir connaissance de ma classe hérité "SuperClient".
Marsh Posté le 21-08-2013 à 19:35:24
Il doit y avoir des millions d'exemples pour des factory ...
Code :
|
Code :
|
Edit : fix pour l'indentation cassée
Marsh Posté le 22-08-2013 à 19:19:31
Merki.
Finalement je m'en suis sorti avec mes templates :
Code :
|
En revanche je me demande si ya moyen de spécifier que la class passé en template doit forcement dériver de "Client" ?
Marsh Posté le 22-08-2013 à 19:35:54
azubal a écrit : Merki.
|
Pas de manière élégante. Les "concepts" ont été repoussés au prochain standard au moins.
Cela étant dit, tu peux probablement tricher en faisant un static_cast<IClient*>( pT ); qui causera une erreur de compilation si le type n'est pas de la bonne famille.
Marsh Posté le 25-08-2013 à 00:34:04
Joel F a écrit : ou utiliser boost::is_base_derived |
Ca fait le test au runtime ou à la compilation, ca ?
Parce que dans son cas, le top, c'est d'avoir le message à la compilation ...
Marsh Posté le 25-08-2013 à 10:52:35
Ce serait mieux à la compilation en effet.
Et je fais partie de ceux qui (très probablement à tord) ne veulent pas utiliser boost.
Marsh Posté le 26-08-2013 à 14:51:20
c'est a la compilation.
Apres l'outil est la si vous voulez vous cassez les pieds a reinventer la roue carre, allez y.
Marsh Posté le 26-08-2013 à 16:13:34
Joel F a écrit : c'est a la compilation. |
Citation : This version detects ambiguous base classes and private base classes correctly |
Cette info en début de la doc me fait me demander si c'est toujours désirable de connaître l'héritage privé des classes.
Et accessoirement, parfois, on a des contraintes qui font aussi que non, on ne peut pas s'en servir, parce que "l'outil" ne fait pas partie du standard et parce qu'on a des restrictions spécifiques
(Et personnellement, je suis dans le cas bâtard où une partie du projet sur lequel je bosse a droit à C++11 et boost, mais pas le reste du projet )
Du coup, ca reste bien de savoir faire une roue octogonale
Marsh Posté le 21-08-2013 à 17:36:47
Hello à tous,
Je m'y perds un peu dans tous ces principes de cast et de polymorphisme alors j'en appel à vous.
Soit le code suivant :
Question 1 :
Est ce légal de faire ça ?
Question 2 :
Le static_cast semble fonctionner mais le dynamic_cast me retourne un pointeur nul.
Pourquoi ?
Merci pour votre aide
Message édité par azubal le 21-08-2013 à 17:38:05