HÉRITAGE,MÉTHODES VIRTUELLES ET CLASSES ABSTRAITES

Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 - 15 avril 2004 à 21:03
BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005 - 27 avril 2004 à 13:19
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

BlackGoddess Messages postés 338 Date d'inscription jeudi 22 août 2002 Statut Membre Dernière intervention 14 juin 2005
27 avril 2004 à 13:19
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)
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
15 avril 2004 à 21:15
'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.
Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
15 avril 2004 à 21:03
éxécusez-moi pour le quelques honteuses fautes d'orthographe .
Rejoignez-nous