Bonjour,
En voulant afficher la structure de mes classes, je suis tombé sur une petite "curiosité".
Je calcule l'offset d'un donnée membre m dans une classe C, avec &((C*)0)->m. Ce qui marche plutôt bien.
Par contre, pour les classes parentes, je ne peux apparemment pas utiliser un pointeur NULL. Il semblerait que le pointeur NULL reste NULL quelquesoit le cast effectué:
Ce qui donne :
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
37
38
39 #include <iostream> class UN { public : UN():un(1){} int un; }; class DEUX { public : DEUX():deux(2){} int deux; }; class C : public UN, public DEUX { }; int main(int argc, char* argv[]) { C *pc1 = &C(); C *pc2 = (C*)0; C *pc3 = (C*)1; DEUX* pdeux = (DEUX*)pc1; unsigned offset_1 = (unsigned)(DEUX*)pc1 - (unsigned)pc1; unsigned offset_2 = (unsigned)(DEUX*)pc2 - (unsigned)pc2; unsigned offset_3 = (unsigned)(DEUX*)pc3 - (unsigned)pc3; std::cout << pdeux->deux << std::endl << std::endl; std::cout << offset_1 << std::endl; std::cout << offset_2 << std::endl; std::cout << offset_3 << std::endl << std::endl; return 0; }
J'utilise Visual Studio. Est ce un comportement standard, ou spécifique à mon compilo?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 2 4 0 4
Au passage, connaissez vous un moyen de connaitre (à la compilation/execution) la présence ou non et la position de la vfptr?
Partager