HÉRITAGE,MÉTHODES VIRTUELLES ET CLASSES ABSTRAITES
Pamaury
Messages postés341Date d'inscriptionjeudi 3 avril 2003StatutMembreDernière intervention17 juin 2008
-
15 avril 2004 à 21:03
BlackGoddess
Messages postés338Date d'inscriptionjeudi 22 août 2002StatutMembreDernière intervention14 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.
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és364Date d'inscriptionmercredi 11 février 2004StatutMembreDernière intervention 5 octobre 20062 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és341Date d'inscriptionjeudi 3 avril 2003StatutMembreDernière intervention17 juin 20083 15 avril 2004 à 21:03
éxécusez-moi pour le quelques honteuses fautes d'orthographe .
27 avril 2004 à 13:19
#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)
15 avril 2004 à 21:15
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.
15 avril 2004 à 21:03