static_cast objet fille pointeur - C++ - Programmation
Marsh Posté le 28-04-2009 à 15:07:45
par contre un ptit delete pA à la fin du programme et ça plante à lexec
int main()
{
B * pB=static_cast<B*>(new A);
pB->n =4;
pB->vB();
delete ((A*)pB);
system("pause" );
}
Marsh Posté le 28-04-2009 à 15:32:25
tiens d'ailleurs ça fait un parfait exemple concernant les excpetions, comment cela se fait t-il que lorsque je try catch le delete ça plante tout de même ??
try
{
delete ((A*)pB);
}
catch(std::runtime_error& z)
{
cout << z.what();
}
plante salement
Marsh Posté le 28-04-2009 à 15:39:42
je ne suis pas tout à fait sur que ce soit catchable, comme problème (enfin, sur tout compilo) ... J'ai pas trop le temps de vérifier ce que dit le Stroustrup immédiatement ...
Edit : un bref détour par le chapitre 14.10 semble indiquer que delete ne retourne pas d'exception standard. à confirmer.
Marsh Posté le 28-04-2009 à 16:59:07
pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé*
La syntaxe (X*) est à bannir.
Tu peux catcher ce que tu veux avec ton delete, ça te feras une corruption de tas et puis c'est tout.
Marsh Posté le 28-04-2009 à 17:29:41
Taz a écrit : pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé* |
Je ne vois pas trop pourquoi tu veux interdire un static cast de ce genre ? Ca me semble tout à fait légal (qui plus est, les RTTI sont pas forcément activés chez tout le monde)
Marsh Posté le 29-04-2009 à 00:11:05
c'est légal mais casse gueule. J'attends pas de quelqu'un qui fait du (A*) qu'il fasse bien la différence quand c'est OK ou pas.
Marsh Posté le 29-04-2009 à 00:41:51
Taz a écrit : pas de static_cast mais dynamic_cast pour un ce genre de conversion Base* -> Derivé* |
oui mais j'ai pas forcément de fonction virtual dans ma classe A, et de ce fait je suis pas sûr qu'un dynamic_cast soit ok justement
Marsh Posté le 29-04-2009 à 09:30:05
dynamic_cast fonctionnera bien que ta classe aie des méthodes virtuelles ou non.
Et pense bien à tester le retour de dynamic_cast, vu que ca peut te retourner un pointeur nul si jamais ton objet n'est pas du type dans lequel tu le castes.
Marsh Posté le 29-04-2009 à 12:14:58
en tout cas sous visual 2008 ça marche pas
error C2683: 'dynamic_cast' : 'A' n'est pas un type polymorphe
Marsh Posté le 29-04-2009 à 12:27:10
Glock 17Pro a écrit : en tout cas sous visual 2008 ça marche pas |
"Stroustrup approved", effectivement, on ne peut pas faire de dynamic_cast de ce genre, d'après le standard cela dit, c'est un peu risqué d'utiliser des interfaces sur des objets non polymorphiques (ne serait-ce que pour une question de destruction de l'objet)
Marsh Posté le 29-04-2009 à 13:02:03
D'autant plus que dans mon cas le dynamic_cast renverrait toujours NULL, donc seul le recours à static_cast permet d'avoir un pointeur 'partiellement' utilisable, partiellement car effectivement je devrais m'interdir l'accés aux méthodes et attribus de B
Marsh Posté le 28-04-2009 à 14:50:19
Hi,
C'est normal qu'un code comme ça compile et ne plante pas à l'éxécution? car à aucun moment on a appeler le constructeur de la classe B et pourtant le programme affecte un membre donné de cette classe et appel une méthode
Message édité par Glock 17Pro le 28-04-2009 à 15:00:48