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 :

surcharge operateur delete et héritage


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut surcharge operateur delete et héritage
    Bonjour

    j ai une classe A

    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
    class A
    {
       A(){};
       virtual ~A(){};
    .....
    }
     
    et une classe B qui hérite de A
    class B : public A
    {
       B(){};
       virtual ~B(){};
       static void operator new ( size);
       static void operator delete ( size);
    }
    class C : public A
    {
       C(){};
       virtual ~C(){};
       static void operator new ( size);
       static void operator delete ( size);
    }
    j ai plusieurs classes qui heritent de A.

    dans mon code, je fais tjs un new avec une classe fille.

    Mais un moment je fais delete A. Et la du coup j ai l impression que je n appelle pas le delete de la classe B ou de C.

    Que dois je ecrire en plus?

    Merci

    Hervé


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Bonjour


    Pourquoi avez vous besoin de redefinir "new" et "delete" :

    Ceci dit si vous devez vraiment les redefinir. Je suis pas sur mais a priori pour appeller les fonctions des classes filles meme lorsque l'objet est caste avec la classe pere il faut que les fonctions soient virtuelles...
    Donc moi je rajouterai un virtual devant le delete.

  3. #3
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    En général, ce n'est pas une bonne idée de redéfinir les opérateurs delete et new (par défaut ils fonctionnent très bien...)

    Par ailleurs, les signatures des opérateurs sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void* operator new(size_t s)
    void operator delete(void* p)
    Il existe d'autre possibilité (ajouter des arguments).

  4. #4
    Candidat au Club
    Inscrit en
    Mars 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    les operateurs delete et new sont par définition static donc impossible d ecrire Virtual

    Les 2 ecritures sont bonnes avec ou sans static.

    merci pour vos idées

    Hervé

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 703
    Points
    10 703
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Hervé
    les operateurs delete et new sont par définition static donc impossible d ecrire Virtual
    alors:
    Mais un moment je fais delete A. Et la du coup j ai l impression que je n appelle pas le delete de la classe B ou de C.
    pourquoi attends-tu un comportement virtuel ?

    Pour le static, il est implicite.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, on pourrait redéfinir les opérateurs, mais là, le destructeur est virtuel, donc quand tu fais delete machin, c'est le destructeur de B qui est appelé en premier puis celui de A, même si machin est en fait un pointeur vers A, du moment que machin = new B.
    Fais le test avec un affichage, tu verras !

Discussions similaires

  1. Réponses: 22
    Dernier message: 17/07/2008, 09h51
  2. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  3. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  4. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 15h57
  5. [MFC] ADO et operateur delete
    Par 0xYg3n3 dans le forum MFC
    Réponses: 9
    Dernier message: 26/03/2005, 14h38

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