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 :

Transtypage dynamique : pré-requis


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut Transtypage dynamique : pré-requis
    Bonjour,

    Certains disent qu'afin d'utiliser dynamic_cast, il est nécessaire d'avoir une méthode déclarée en virtuel dans la classe mère de la classe utilisé. Voir que ce soit carrément la classe mère qui doit être déclarée en virtuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MaClassefille : virtual public MaClasseMère
    Et d'autre disent que rien de tout cela n'est nécessaire.

    J'aimerai donc avoir votre opinion la dessus, et aussi, est ce que cette optique/obligation peut changer en fonction des bibliothèques qu'on serait susceptible d'utiliser?

  2. #2
    screetch
    Invité(e)
    Par défaut
    ce n'est pas vraiment une opinion, c'est un fait.

    pour que dynamic_cast puisse fonctionner il est necessaire que la classe aie une vtable, c'est a dire qu'elle aie au moins une methode virtuelle connue

    par exemple :

    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
     
    class Mere
    {
    };
     
    class Fille : public Mere
    {
    	virtual void doStuff() { };
    };
     
    int main(int argc, char** argv)
    {
    	Mere* fille = new Fille;
    	dynamic_cast<Fille*>(fille)->doStuff();
    }
    refusera de compiler (le compilateur dit : "Mere is not a polymorphic type"

    en revanche
    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
    class Mere
    {
    public:
    	virtual ~Mere();
    };
     
    class Fille : public Mere
    {
    public:
    	virtual void doStuff() { };
    };
     
    int main(int argc, char** argv)
    {
    	Mere* fille = new Fille;
    	dynamic_cast<Fille*>(fille)->doStuff();
    }
    fonctionne

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    Je vois que tu as déclaré le destructeur en virtual, j'ai vu dans une autre discution (que je ne pourrais pas situer pour faute d'oublie) que c'était la méthode de base (ou une convention peut être?) pour déclarer une classe polymorphique. J'aimerai donc être sûr: est ce que je peux déclarer n'importe qu'elle méthode en virtual? Même si je ne me sers pas de cette méthode ?

    Tu as déclaré doStuff() en virtual aussi: est-ce nécessaire ou la aussi, on aurait pu déclarer n'importe qu'elle méthode en virtual?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En C++, la philosophie est de ne pas payer pour ce qu'on n'utilise pas. Ainsi, une classe n'ayant pas de fonction virtuelle ne possède pas les structures nécessaires pour faire du dynamic_cast. A partir du moment où une fonction virtuelle, n'importe laquelle, existe, c'est bon.

    Pourquoi le destructeur ? Parce que.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 239
    Par défaut
    D'accord, et merci.
    Mais est-il aussi necessaire d'avoir une méthode virtuelle dans notre classe fille pour utiliser Dynamic_cast?
    dans l'exemple de Screetch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void doStuff() { };
    donc ceci est-il nécessaire?

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Non, ça laisse sous-entendre qu'on peut "tranquillement" dériver la classe Fille en une classe FilleFille () par exemple.

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

Discussions similaires

  1. Utiliser un transtypage "dynamique"
    Par JPLSOFT dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/05/2014, 08h49
  2. Un transtypage dynamique
    Par Asaheim dans le forum C#
    Réponses: 8
    Dernier message: 25/04/2013, 00h03
  3. Transtypage et objet dynamique pour l'interface
    Par TokTokTok dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 04/03/2009, 19h13
  4. Réponses: 3
    Dernier message: 28/01/2009, 14h02
  5. [Delphi 7]Transtypage et appels dynamique de methodes
    Par Jabbal'H dans le forum Delphi
    Réponses: 3
    Dernier message: 09/11/2006, 17h46

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