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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    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
    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

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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

  3. #3
    Membre confirm�
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    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
    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 confirm�
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    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
    Par d�faut
    d'accord

  5. #5
    Expert confirm�
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    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 772
    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

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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.

  7. #7
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 confirm�
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    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
    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 : 51
    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
    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 confirm�
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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