Salut tout le monde,
J'ai un problème en ce qui concerne l'héritage. J'ai une classe mère CServer et une classe fille CBackup et j'ai besoin de convertir CServer en CBackup.
Est ce possible?
Merci d'avance.
Version imprimable
Salut tout le monde,
J'ai un problème en ce qui concerne l'héritage. J'ai une classe mère CServer et une classe fille CBackup et j'ai besoin de convertir CServer en CBackup.
Est ce possible?
Merci d'avance.
Que veux-tu dire EXACTEMENT par "convertir CServer en CBackup" ?
En fait, j'ai une troisième classe (COther) qui contient la classe CServer. La classe COther contier une fonction qui selon le type du serveur (Master ou backup) doit pouvoir accèder aux membres de la classe CServer et de la classe CBackup.
Code:
1
2
3
4
5
6
7
8
9
10 Class COther { public: CServer Server; int ServerType; public: COther(CServer *server); int MyFunction(); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12 int COther::MyFunction() { if(ServerType == 1) { //Some code } else { //Ici je dois pouvoir accèder à des membres de la classe fille } }
Comment puis je faire cela?
Si tu es sûr de ton coup, un simple static_cast< CBackup * >(Server) suffit.
Sinon, tu peux utiliser un dynamic_cast et vérifier que le pointeur retourné n'est pas NULL.
PS: Cela ressemble fort à une erreur de conception. Pourquoi ne pas utiliser une fonction membre virtuelle dans CServer et CBackup ?
Je vais essayer la méthode que tu as proposé.
En fait, je peux éliminer la troisième classe, elle présente d'autres fonctionnaliés et c'est tout une autre histoire.
ça marche, merci.
Tu pourrais m'expliquer, c quoi au juste cette commande?
Pour ça, je me vois obligé de te dire de relire ton cours de C++ : Les opérateurs de forcage de type font partie du langage lui-même.
Ce que je peux dire, c'est qu'il y en a des plus permissifs que d'autres, notamment pour convertir un pointeur en un autre.
- Le cast de type C ("C-Style cast") et son extension C++ ("Function-Style cast") sont les plus permissifs: ils permettent de convertir tout en n'importe quoi : Flottant en entier, entier en pointeur, pointeur d'un type à l'autre, pointeur const en non-const, etc.
- Le static_cast est le moins permissif: Il permet de convertir les types d'entiers entre eux, il peut convertir un void* en (n'importe quel type)*, ou un CBase* en CDerivee * (la conversion dans l'autre sens étant implicite et n'ayant donc pas besoin de cast). On ne peut PAS convertir un pointeur const en pointeur non-const.
- Le dynamic_cast ne peut (ou ne doit) s'utiliser que sur des pointeurs d'objets: Il sert justement à convertir un CBase* en CDerivee* (ou d'autres conversions du même tonneau) mais retourne un pointeur NULL si l'objet pointé n'est pas du bon type. C'est un peu plus lent qu'un static_cast, par contre.
- Le reinterpret_cast est plus permissif que le static_cast, je crois qu'il permet toutes les conversions SAUF pointeur const en pointeur non-const.
- Le const_cast permet de convertir un pointeur const en pointeur non-const. Son utilisation doit rester exceptionnelle, surtout pour un débutant.
Pour éviter les erreurs, on utilise les opérateurs les moins permissifs possibles. Quand on programme en C++, le cast de type C est à bannir.
Je me rappelle avoir lu ça quelque part :P merci bcp :)