IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

cast d'objet parent en classe fille


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 32
    Points : 27
    Points
    27
    Par défaut cast d'objet parent en classe fille
    Bonjour à tous,

    Je sais que c'est un peu long, mais je suis obligé de décrire mon cas avant de poser ma question.

    J'ai une classe qui possède un objet "objetPrincipal" de type TGeneric.
    La classe TGeneric possède des méthodes virtuelles a,b,c,...
    J'ai différentes classes filles (TFille1, TFille2, ...) qui dérivent toutes directement de TGeneric et qui redéfinissent toutes différemment les méthodes virtuelles a,b,c,...

    En fonction d'un fichier de configuration, j'aimerais que mon objet soit du type TFille1 ou TFille2 ou ... pour utiliser les méthodes a,b,c,... de ces classes filles.
    Le but est que je puisse toujours appeller dans mon programme "objetPrincipal" et ces méthodes virtuelles sans me soucier de connaître le type défini par la config.

    Bien entendu j'aimerais que les méthodes lancées soient les métodes filles a,b,c,...

    Quelqu'un peut-il m'éclairer pour me dire comment je peux "changer le type" de mon objetPrincipal dynamiquement ?

    J'ai vu dans la FAQ le dynamic_cast, mais je crois être obligé de faire une référence sur un objet fils alors que je ne veux pas instancier d'autres objets ou au besoin un objet temporaire uniquement pour le cast.

    Merci pour votre aide, et désolé si la réponse est évidente, je ne suis pas un expert en POO .

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Si tes méthodes sont virtuelles, il faut stocker un pointeur ou une référence, et le fait que les méthodes sont virtuelles fera que la bonne méthode sera appelée.

    Par contre il faut que ton pointeur pointe vers un objet du bon type. Donc en gros, tu instancies un objet du type correspondant à ton fichier de config, ensuite tu l'assignes à un pointeur de type TGeneric* c'est c'est bon.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup bolhrak pour ton aide.

    J'ai réussi en suivant tes explications et je poste ici un peu de code pour ceux que la solution intéresse.
    Définition des classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    ref class TGeneric abstract {
       public: Generic(void){};
       protected: ~TGeneric(){};
       public: virtual System::Void MethodeA(void) abstract;
       public: virtual System::Void MethodeB(void) abstract;
    }; //TGeneric class
     
    ref class TFille1 : TGeneric {
       public: TFille1(void){};
       protected: ~TFille1(){};
       public: virtual System::Void MethodeA(void) override {
          int i = 0; //C'est juste pour mettre qqchose
          i++;
       }; //TFille1::MethodeA
       public: virtual System::Void MethodeB(void) override {
          int j = 0; //C'est juste pour mettre qqchose
          j++;
       }; //TFille1::MethodeB
    }; //TFille1 class
     
    ref class TFille2 : TGeneric {
       public: TFille2(void){};
       protected: ~TFille2(){};
       public: virtual System::Void MethodeA(void) override {
          int k = 0; //C'est juste pour mettre qqchose
          k++;
       }; //TFille2::MethodeA
       public: virtual System::Void MethodeB(void) override {
          int l = 0; //C'est juste pour mettre qqchose
          l++;
       }; //TFille2::MethodeB
    }; //TFille2 class
    Déclaration du pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TGeneric^ objetPrincipal;
    Instanciation de l'objet en fonction d'un paramètre quelconque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    System::String^ ChoixConfig = "Première";
     
    if (ChoixConfig == "Première")
       objetPrincipal = gcnew TFille1();
    else
       objetPrincipal = gcnew TFille2();
    Appelle d'une des méthodes virtuelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    objetPrincipal->MethodeA();  // => la méthode appellée est bien TFille1::MethodeA

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. La destruction d'un objet d'une classe fille
    Par DLOYAS dans le forum C++
    Réponses: 2
    Dernier message: 30/12/2014, 21h05
  2. Réponses: 2
    Dernier message: 20/05/2011, 14h15
  3. [POO] Cast d'objet vers une classe
    Par karl3i dans le forum Langage
    Réponses: 9
    Dernier message: 27/07/2009, 11h12
  4. Constructeur classe dérivée à partir d'objets parents
    Par Zavonen dans le forum Général Python
    Réponses: 16
    Dernier message: 06/04/2009, 21h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo