Si nous utilisons l'héritage multiple, découpage en tranches fera les adresses aux objets parents diffèrent de l'adresse à des objets de la feuille:Pourquoi static_cast fonctionne-t-il toujours avec des pointeurs NULL malgré le découpage?
struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};
Donc, si nous avons un objet Z
z
, son adresse &z
sera pas coïncider avec la adresse de son Y
parent: static_cast<Y*>(&z)
est quatre octets supérieur à &z
. La bonne chose à propos de static_cast
est que c'est, bien, statique, donc ne prend pas de temps d'exécution (par rapport à dynamic_cast
, c'est). Toutefois, si nous avons un Z*
qui pointe à 0
, chaque conversion à un parent doit et génère également un pointeur null. Pourquoi cela fonctionne-t-il et comment est-il mis en œuvre? Est-ce que cela implique que chaque static_cast
introduit une instruction de branchement?
Cela fonctionne parce que chaque objet de type 'Z' est aussi un objet de type« Y ». Une classe de base de pointeur peut implicitement pointer vers des objets de classe dérivée. –
@Als: Je parle de l'implémentation de 'static_cast'. Bien sûr, chaque 'Z' contient un' Y' mais leurs adresses diffèrent. Cependant, comme vous pouvez le constater, static_cast (zPtr) 'sera' 0' si 'zPtr' est' 0'. –
bitmask
"c'est, bien, statique, donc ne prend pas de temps d'exécution" - hein? Vous réalisez qu'un 'static_cast' peut également convertir entre entiers de tailles différentes, n'est-ce pas? Ce n'est pas (généralement) un non-op à l'exécution non plus. – hvd