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

SL & STL C++ Discussion :

Méthodes virtuel,inline en orienté objet?


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Midou45
    Homme Profil pro
    Ingénieur
    Inscrit en
    Novembre 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 156
    Par défaut Méthodes virtuel,inline en orienté objet?
    bonjour, je veux savoir pourquoi le destructeur"par défaut" d'un objet est une méthode virtuel??
    J'ai pas bien compris la notion de fonction inline et comment l'utiliser.

  2. #2
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 477
    Par défaut
    Hmm allez je la tente.. en espérant pas me planter ;p

    1 ) On définit le destructeur comme virtuel lorsqu'une classe est destinee à être dérivée. Cela permet durant l'exécution d'appeler le bon destructeur en fonction du type du pointeur qui a été alloue;

    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 CMere
    {
    ~Mere(){}
    };
     
    class CFille
    {
    int* tab;
    CFille()
    {
        tab = new int[20];
    }
    ~CFille()
    {
        delete[] tab;
    }
    };
    Si comme dans ce cas on ne definit pas le destructeur virtuel, et qu'on réalise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Cmere* cm = new CFille;
    delete CFille;
    Le tableau de 20 entiers n'est pas détruit.. en effet c'est le destructeur de la classe CMere qui est appelé et qui est vide.
    En déclarant le destructeur virtuel, le "dynamic binding" veillera à ce que le destructeur correspondant au type de l'objet pointé soit appelé.

    2 ) les fonctions déclarées inline sont lors de la compilation recopiée directement dans le code.
    Cela permet de ne pas avoir dans le cas d'une fonction appelé très souvent de problème de performance - l'appel de fonction a un cout - tout en gardant la sécurité de l'encapsulation - à comparer aux #define en C -.


    En espérant être dans le vrai et me faire comprendre

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    1) la FAQ
    2) encore la FAQ

    Voilà !

    MAT.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Je lis :

    Vous pouvez alors deviner ce que l'instruction delete a; provoque : la destruction d'un objet de type A, donc l'appel de A::~A(), et de rien d'autre.

    C'est "divination" est inexacte (pour ne pas dire entièrement fausse) : en fait c'est un comportement indéfini.

    Ce qui signifie qu'il faut absolument un destructeur virtuel dans ce cas, même si les destructeur de la classe dérivée ne fait "rien de plus" que celui de la classe de base.

    En effet, c'est la virtualité du destructeur
    • qui dit à 'delete' d'aller chercher l'adresse réelle de l'objet (l'adresse de l'objet complet), qui peut être différente de celle passée à delete;
    • c'est aussi elle qui permet de trouver le bon opérateur delete membre si la classe dérivée en déclare un autre que la classe de base.

    Sans destructeur virtuel, l'adresse passée à 'operator delete' (la fonction, pas l'expression 'delete') peut être incorrecte et corrompre le free-store (free-store = tas). En pratique, ce cas va se produire en cas d'héritage multiple (ou virtuel).

    La phrase "la destruction d'un objet de type A, donc l'appel de A::~A(), et de rien d'autre." me parait donc inappropriée.

    Pour un objet automatique (variable locale d'une fonction) ou global, il n'y a aucun problème de destruction parce que le compilateur connait toujours le type réel de l'objet. La règle du destructeur virtuel s'applique aux appels à delete, avec un pointeur sur une classe de base de l'objet créé (type différent de celui utilisé avec 'new') :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Base *bp = new Derived;
    delete bp; // le destructeur DOIT être virtuel
    La règle s'applique aussi aux appels explicites au destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Base *bp = new Derived;
    bp->~Base (); // le destructeur DOIT être virtuel
    // mais pourquoi voudriez-vous faire cela?
    // Ceci n'est PAS une incitation.
    J'insiste peut-être lourdement, parce que la FAQ traite la chose trop à la légère AMA.

Discussions similaires

  1. [Débutant] Méthodes Get/Set en Programmation Orientée Objet
    Par ghada97 dans le forum MATLAB
    Réponses: 32
    Dernier message: 20/11/2013, 12h25
  2. [Débutant] [POO] Appel de méthodes en programmation orientée objet
    Par ghada97 dans le forum MATLAB
    Réponses: 6
    Dernier message: 26/10/2013, 11h50
  3. Réponses: 3
    Dernier message: 13/07/2012, 12h12
  4. Réponses: 5
    Dernier message: 11/04/2012, 16h29
  5. Méthode orientée objet pour la modélisation
    Par saif2009 dans le forum Méthodes
    Réponses: 4
    Dernier message: 27/09/2011, 17h12

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