HÉRITAGE,MÉTHODES VIRTUELLES ET CLASSES ABSTRAITES

Signaler
Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
-
Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/21981-heritage-methodes-virtuelles-et-classes-abstraites

Messages postés
338
Date d'inscription
jeudi 22 août 2002
Statut
Membre
Dernière intervention
14 juin 2005

petit exemple pour appuyer l'interêt des destructeurs virtuels :

#include

struct mere
{
mere()
{
std::cout << "mere::mere()\n";
}

/*virtual*/ ~mere()
{
std::cout << "mere::~mere()\n";
}
};

struct fille : mere
{
fille()
{
std::cout << "fille::fille()\n";
}

/*virtual*/ ~fille()
{
std::cout << "fille::~fille()\n";
}
};

int main()
{
mere *test = new fille();
delete test;
}

avec les 2 destructeurs non virtuels, au delete seul mere::~mere est appelé
avec les 2 destructeurs virtuels, fille::~fille est appelé puis mere::~mere, c'est la bonne solution.
avec mere::~mere virtuel et pas fille::~fille, cela fonctionne aussi, par contre ca ne fonctionnerait pas si une classe héritait de fille.
avec mere::~mere pas virtuel mais fille ::~fille oui, compilé avec VC++7.1, le programme produit un ASSERT puis se plante a l'execution (voir le comportement avec d'autres compilo)
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
'lut. En regardant rapidement,
tu ne mets pas tes destructeurs virtuels, ça risque de te coûter
cher un jour ou l'autre (cf class5.cpp ), les destructeurs de tes
classes héritières ne seront pas appelées.
Pourquoi utilises tu des printf ? cout est tellement plus simple...
Utilises les const (char*) là où il faut en mettre, un compilo
digne de ce nom risque de t'ennuyer sinon (set_message par exemple), idem pour les accesseurs.
le destructeur par défaut du compilo est le même que le tiens... quel est l'intéret de le faire...
Tu n'expliques pas à quoi servent les différentes forment d'héritage (public, protected, private ). Notamment dans class2.cpp
tu fais hériter une balle d'une color... il faudrait vraiment une bonne
raison pour ne pas mettre la color en attribut de classe.
Messages postés
341
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
17 juin 2008
2
éxécusez-moi pour le quelques honteuses fautes d'orthographe .