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 :

un constructeur virtuel ?


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut un constructeur virtuel ?
    bonsoir,

    normalement un constructeur ne "doit" jammais être virtual mais est ce que c'est faux au niveau de la syntaxe!?

    j'avais un examen en c++ et cette question est posée dans l'examen j'ai expliqué pourquoi il ne doit pas être virtual, mais je pense que j'ai mentionné que ca va pas genèrer quand meme une erreur dans le code ma réponse est elle juste ?

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Quand tu te poses une question de syntaxe, demande au compilateur.

    Par ailleurs, quand veux-tu que le compilateur intervienne virtuellement?

    PS: Comme la charte nous le demande, je ne réponds pas à la question, je t'aide à y répondre
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    j'ai fais un test sur mon compilatuer et il n'a pas accepté le mot virtual avent la declaration du constructeur

  4. #4
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    d'accord

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Désolé je me suis trompé : j'ai répondu pour le côté "polymorphique" mais c'est vrai qu'il y a le mécanisme virtuel avec une table et que le constructeur est une méthode particulière

    La réponse de Bjarne Stroustrup

    A virtual call is a mechanism to get work done given partial information. In particular, "virtual" allows us to call a function knowing only any interfaces and not the exact type of the object. To create an object you need complete information. In particular, you need to know the exact type of what you want to create. Consequently, a "call to a constructor" cannot be virtual.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    en fait, ca va très loin dans les détails.

    Supposons que j'ai les trois classes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Détail {
    private:
        int a;
    protected:
        ~Détail(){}
    };
    class Base : private Détail {
        int b;
    public:
        virtual ~Base(){};
    };
    class Variante : public Base {
        int c;
    };
    Avec un code tel que Base * p = new Variante(); il se passe plusieurs choses:
    • On déclare p, un pointeur vers Base,
    • On crée un objet de type Variante, alloué sur le tas,
    • On affecte son adresse au pointeur.


    Le code des constructeurs complêtement décris est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Détail() : a() {}
    Base() : Détail(), b() {}
    Variante() : Base(), c() {}
    Et quand tu appelles Variante(), c'est ce qu'il va se passer:
    1. création de la mémoire pour un Variante,
    2. début de la construction du Variante
    3. début de construction de la Base (classe mère de Variante)
    4. début de construction du Détail (classe mère de Base)
    5. initialisation des variables membres de Détail (donc a).
    6. corps du constructeur de Détail (ici rien)
    7. suite de l'initialisation de Base, avec ses variables membres (donc b).
    8. corps du constructeur de Base (ici rien)
    9. suite de l'initialisation de Variante, avec ses variables membres (donc c).
    10. corps du constructeur de Variante (ici rien)


    Viens alors le problème frère de la construction.
    Que se passe-t-il quand tu détruis le pointeur p?

    delete p; appelle le destructeur de son type, en l'occurence p->~Base();, puis libérera le bloc mémoire.
    un destructeur appelle systématiquement les destructeurs dans l'ordre inverse de la construction, c'est à dire, les membres (de bas en haut), puis les classes de bases.
    Sans précaution, dans notre exemple, ça voudrait dire:
    • le corps du destructeur de Base est appelé
    • le champ b est détruit
    • le destructeur de Détail est appelé
    • son corps est exécuté
    • puis a est détruit.


    Du coup, le champ c ne serait pas détruit, et le corps de ~Variante() ne serait pas appelé.
    C'est pour cela que j'ai défini le constructeur de Base comme virtual.
    Pour faire en sorte que lorsqu'on tente de détruire un pointeur, le destructeur est cherché dans la table des fonctions virtuelles (la vtable) et que ce soit ~Variante() qui soit trouvée.

    Je n'ai pas besoin de faire pareil avec Détail, parce le destructeur est protégé: je ne pourrai jamais faire un delete sur un pointeur de Détail.

    Il y a des articles sur la construction et la destruction dans la faq, prends le temps d'aller les lire.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par DLOYAS Voir le message
    j'ai fais un test sur mon compilatuer et il n'a pas accepté le mot virtual avent la declaration du constructeur
    Et ?
    Il t'a sorti une erreur, un numéro, sûrement même du texte.
    Ce n'est pas suffisament clair ? Ca nécessite vraiment un poste sur un forum ?
    La plupart, pour ne pas dire la totalité, de tes questions sont des questions auxquelles le compilateur a une réponse toute et très bien faîte.

    Btw, un constructeur virtuel, ça n'aurait pas grand sens.
    Et l'appel à une fonction virtuelle dans le constructeur est aussi "impossible". La vtable n'existe pas encore dans le constructeur, et c'est le type statique qui sera utilisé, et non le polymorphisme.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    M.Bousk
    relire svp ma question..
    je sais bien que un constructeur ne devra par etre declaré comme virtual et je sais bien pourquoi.. ma question c'est que j'ai écris dans l'examen pourqoui il ne doit par etre (virtual) mais j'ai mentionné que ce n'est une erreur de syntaxe c'est a dire que déclarer un constructeur avec virtual ne posera pas des problèmes pour le compilateur au niveau de syntaxe .
    Est ce que ma réponse est juste ou non?! aprés mon examen j'ai testé une classe avec un constructeur virtual et il n'a pas acdepté l'écriture donc mon 2 ème message : (j'ai fais un test sur mon compilatuer et il n'a pas accepté le mot virtual avent la declaration du constructeur) c'est pour dire que dommage! ma réponse n'est pas juste par pour m'expliquer pourquoi .

  9. #9
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    DLOYAS : C'est une erreur de syntaxe. Tu as donc une erreur dans ta réponse.
    Bousk : C'est en effet un peu plus compliqué pour les fonctions virtuelles dans une constructeur, et il y a un article dans la FAQ là dessus qui détaille les choses : http://cpp.developpez.com/faq/cpp/?p...le-destructeur

    DLOYAS : Si tu me permets, je suis un peu surpris par tes questions (et j'ai l'impression de ne pas être le seul). J'ai l'impression que tu t'attaches à des petits détails du langage, à des points de syntaxe, plutôt qu'à apprendre à bien programmer avec. Visiblement, tu suis un cursus scolaire, où l'on te pose des questions qui peuvent sembler théoriques, mais j'ai l'impression que tu pousses le vice un peu plus loin. Savoir si une erreur est une erreur de syntaxe ou pas n'a pas grand intérêt (et n'est d'ailleurs pas défini clairement par la norme C++), sauf si on écrit un compilateur C++, ou un outil d'analyse de code, ce qui ne devrait pas être ton cas.

    Je comprends que simplement regarder les messages du compilateur peut laisser un goût d'inachevé (après tous, est-ce que ce compilateur se comporte comme tous devraient se comporter), mais l'alternative est de chercher directement la réponse dans la norme, ce qui est une compétence ésotérique à part entière pour s'y retrouver, et je ne le conseille vraiment pas à un débutant. Un autre point d'entrée intéressant est The Design and Evolution of C++, qui explique les raisons derrière certains comportements du langage. Mais là aussi, si on n'en a pas une bonne maîtrise préalable, je pense qu'on doit passer à côté de ce livre. Donc si tu veux mon conseil, oublie un peu ces questions théoriques, et code, code et code encore, et tu verras, tout ira mieux.
    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.

  10. #10
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    JolyLoic : Merci à vous .
    oui C'est ça!le c++ je l'ai comme module dans mon institut, et j'avais plus que 10 points sur des questions théoriques et c'est pour çela que je pose plusieurs questions sur la théorie plus que le code.
    je comprends bien vos réactions,vu que vous êtes des développeurs en c++ et mes questions ne sont pas vraiment interssantes pour vous.
    desolé

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    éventuellement, nous avons un chat, avec une section développement.
    Et puis, tu pourrais créer une seule discussion avec tes questions, quitte à séparer quand l'une d'entre elle ouvre une grande discussion
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par DLOYAS Voir le message
    je sais bien que un constructeur ne devra par etre declaré comme virtual et je sais bien pourquoi.. ma question c'est que j'ai écris dans l'examen pourqoui il ne doit par etre (virtual) mais j'ai mentionné que ce n'est une erreur de syntaxe c'est a dire que déclarer un constructeur avec virtual ne posera pas des problèmes pour le compilateur au niveau de syntaxe .
    Est ce que ma réponse est juste ou non?!
    La vraie réponse, c'est que ça n'a tout simplement pas de sens, vu que pour créer un objet on fait déjà forcément appel au constructeur de son vrai type. Ensuite, que le compilateur l'accepte ou non est probablement défini dans la norme, mais c'est secondaire à côté du fait que ça n'ait pas de sens.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Pattern Strategy et Constructeurs Virtuels VCL
    Par ShaiLeTroll dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/12/2010, 15h48
  2. Constructeur virtuel quel utilité ?
    Par helmis dans le forum Langage
    Réponses: 4
    Dernier message: 26/09/2008, 14h31
  3. Constructeurs et classe de base virtuelle
    Par Paul Atreide dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2006, 17h04
  4. [POO]Probléme de constructeur virtuel surchargé
    Par Laurent Dardenne dans le forum Delphi
    Réponses: 10
    Dernier message: 15/08/2006, 12h19
  5. Réponses: 2
    Dernier message: 01/06/2006, 14h36

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