Bonjour,
J'essaye de comprendre le fonctionnement de destructeurs virtuels.
Si on considère une classe de base et une classe héritée de cette classe, alors il risque d'y avoir des problèmes si il n'y a pas de destructeurs virtuels.
Je suis d'accord, cela semble logique.
J'ai décidé de mettre en application ce qui est écrit, avec l'héritage suivant.
Normalement, ptkk ne devrait prendre en compte que la partie de base de l'objet pointé par pta.
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36 class TimeKepper{ private: int o; public: TimeKepper(int u):o(u){}; ~TimeKepper(); }; TimeKepper::~TimeKepper(){ cout<<"~TimeKepper()"; } class AtomicClock:public TimeKepper{ public: int k; public: AtomicClock(int i,int j):TimeKepper(i),k(j){}; static AtomicClock* getAtomicClock(); ~AtomicClock(){ cout<<"ee"; }; }; void main(){ int *o; AtomicClock *pta=new AtomicClock(9,8); { TimeKepper *ptkk=0; o=&(pta->k); ptkk=pta; delete ptkk; } }
Quand on fait delete ptkk, celui-ci ne devrait détruire que la partie de base de l'objet pointé par pta, laissant dans la mémoire la partie héritée. Ce qui fait que l'on pourrait toujours avoir la valeur 8 via *o. Or, ceci n'est pas le cas, car malgré l'absence de destructeurs virtuels, on ne peut plus lire la valeur de *o après la destruction. Qu'il y ait destructeur virtuel ou non, cela ne change rien. Je ne comprends pas pq.
(c'est pourtant exactement ce que fait scott meyers dans son livre pour
illustrer ce risque).
j'ai fait cela car je m'attendais, dans la mémoire, à ne trouver que 00 00 08, et pas 00 00 09 00 00 08 après le passage de delete
Merci
Partager