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++Builder Discussion :

Appel d'une méthode virtuelles [Non suivi]


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Appel d'une méthode virtuelles
    Bonjour,

    Pour des raisons de compatibilités avec Delphi, C++ Builder a du créer une classe de basse du style VCL, qui donne un fonctionnement différent pour l'utilisation des fonctions virtuelles. Ansi si une Classe de basse appelle une fonction virtuelle, c'est la fonction correspondant à la classe déclarée qui est appelée et non celle de base.... Pour mieux comprendre voir l'exemple.

    Pour des raisons de portage vers un autre compilateur (DSP 6713 Texas), je cherche le moyen d'obtenir le meme fonctionnement en C++ standard qu'en C++ avec une classe VCL. C'est a dire faire quelque chose pour que la classe MyBase fonctionne de la meme maniére que la classe MyVCLBase...

    D'aprés mes recherche je pense que c'est pas possible, mais si quelqu'un avais une super idée d'astuce, je suis preneur.

    Merci de votre aide.




    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <sysdefs.h>
    #include <sysutils.hpp>
    #include <iostream.h>
     
    /**************************************/
    /**************************************/
    // Classes C++ standard
    /**************************************/
    /**************************************/
    class MyBase
    {
    public:
     MyBase() { what_am_I(); }
     virtual void what_am_I() { cout << "Je suis une base" << endl; }
    };
     
    class MyDerived : public MyBase
    {
    public:
     virtual void what_am_I() { cout << "Je suis dérivée" << endl; }
    };
     
    /**************************************/
    /**************************************/
    // Classes de style VCL
    /**************************************/
    /**************************************/
    class MyVCLBase : public TObject 
    {
    public:
     __fastcall MyVCLBase() { what_am_I(); }
     virtual void __fastcall what_am_I() { cout << "Je suis une base" << endl; }
    };
     
    class MyVCLDerived : public MyVCLBase 
    {
    public:
     virtual void __fastcall what_am_I() { cout << "Je suis dérivée" << endl; }
    };
     
    int main(void)
    {
     MyDerived *d=new MyDerived;	// instantiation de la classe C++
     MyVCLDerived *pvd = new MyVCLDerived;	// instanciation de la classe de style VCL
     return 0;
    }
    Le résultat de cet exemple est :

    Je suis une base

    Je suis dérivée

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    En rajoutant un constructeur pour la class dérivée pour solliciter la méthode de base :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyVCLDerived : public MyVCLBase
    {
    public:
     __fastcall MyVCLDerived() { MyVCLBase::what_am_I(); }
     virtual void __fastcall what_am_I() { .... }
    };
    A plus !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse mais c'est juste l'inverse que souhaite c'ést a dire:

    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
    #include <sysdefs.h> 
    #include <sysutils.hpp> 
    #include <iostream.h> 
     
    /**************************************/ 
    /**************************************/ 
    // Classes C++ standard 
    /**************************************/ 
    /**************************************/ 
    class MyBase 
    { 
    public: 
     MyBase() { what_am_I(); } 
     virtual void what_am_I() { cout << "Je suis une base" << endl; } 
    }; 
     
    class MyDerived : public MyBase 
    { 
    public: 
     virtual void what_am_I() { cout << "Je suis dérivée" << endl; } 
    }; 
     
     
    int main(void) 
    { 
     MyDerived *d=new MyDerived;   // instantiation de la classe C++ 
     return 0; 
    }
    Le résultat de cet exemple est :

    Je suis une base

    Et je souhaite que ça affiche : (Comme un composant VCL)

    Je suis dérivée

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Et si tu rajoutes un constructeur pour la class dérivée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyDerived : public MyBase 
    { 
    public: 
    MyDerived(); 
     virtual void what_am_I() { cout << "Je suis dérivée" << endl; } 
    };
    Avec un peu de chance...

    A plus !

  5. #5
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    La résolution des méthodes virtuelles est faite après la construction de l'objet. Si tu appelles la fonction virtuelle dans une méthode au lieu du constructeur, ça devrait marcher.

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2013, 12h08
  2. Réponses: 15
    Dernier message: 08/07/2012, 23h49
  3. Réponses: 6
    Dernier message: 10/10/2007, 20h11
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. Comment connaitre l'appelant d'une méthode
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/07/2004, 14h51

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