Maison > Article > développement back-end > Quand l'utilisation de « static_cast » pour le downcasting en C a-t-elle un comportement indéfini ?
Downcasting avec Static_cast en C
Le downcasting est une technique utilisée dans la programmation orientée objet pour convertir un pointeur de classe de base ou une référence à un dérivé pointeur de classe ou référence. En C , cela peut être réalisé en utilisant l'opérateur static_cast.
Considérons l'exemple de code suivant :
class Base { public: Base() {} virtual void func(); }; class Derived : public Base { public: Derived() {} void func(); void func_d(); int a; }; int main() { Base *b = new Base(); std::cout << sizeof(*b) << std::endl; // Prints 4 Derived *d = static_cast<Derived *>(b); std::cout << sizeof(*d) << std::endl; // Prints 8 d->func_d(); }
Dans cet exemple, un pointeur de type Base est créé et initialisé avec un objet de tapez Base. L'opérateur sizeof renvoie 4, indiquant la taille de l'objet Base.
Cependant, lorsque nous essayons de convertir b en un pointeur de type Derived à l'aide de static_cast et que nous l'attribuons à d, la taille de *d devient 8, qui est la taille d’un objet dérivé. Ce comportement est inattendu, car nous nous attendons généralement à ce que la taille de *d soit la même que celle de *b.
La raison de ce comportement réside dans le concept de comportement indéfini (UB). Utiliser static_cast pour convertir un objet en un type qu'il n'a pas réellement produit UB. Dans ce cas, b pointe vers un objet Base, pas un objet Derived. Static_cast ne peut pas changer le type sous-jacent de l'objet, et donc le résultat de la conversion n'est pas défini.
La norme C, dans la section 5.2.9 ([expr.static.cast]), spécifie la règle de downcasting using static_cast : "Si la valeur prvalue de type 'pointeur vers cv1 B' pointe vers un B qui est en fait un sous-objet d'un objet de type D, le pointeur résultant pointe vers l'objet englobant de type D. Sinon, le résultat de la conversion est indéfini."
Dans ce cas, l'objet Base pointé par b n'est pas un sous-objet d'un objet Derived, et donc le résultat de la conversion est indéfini. Les symptômes de l'UB peuvent varier considérablement et il n'y a aucune garantie que la fonction membre dérivée (func_d) puisse être appelée avec succès.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!