Downcasting en C : dévoiler le comportement non défini
En programmation orientée objet, le downcasting est un processus de conversion d'un pointeur ou d'une référence d'un classe de base vers un pointeur ou une référence d’une classe dérivée. En C , cela peut être réalisé en utilisant l'opérateur static_cast. Cependant, les conséquences d'un downcasting inapproprié peuvent prêter à confusion.
Considérez l'extrait 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(); // Calls derived class function successfully }
Dans cet exemple, un pointeur de base b est converti en un pointeur dérivé d à l'aide de static_cast. Étonnamment, d a accès à l’intégralité de l’objet dérivé, y compris la fonction membre func_d(). Cela soulève la question : comment est-ce possible lorsque b pointe uniquement vers un objet de base ?
La réponse réside dans le comportement non défini introduit par le downcasting inapproprié. Selon la norme C, l'utilisation de static_cast pour convertir un pointeur vers un type n'entraîne pas réellement un comportement indéfini. Cela signifie que tout peut arriver, y compris l'exécution correcte de la fonction de classe dérivée.
L'approche correcte du downcasting implique l'utilisation d'un opérateur de conversion sécurisé comme Dynamic_cast. Cet opérateur vérifie si le pointeur de base pointe vers un objet dérivé réel et lève une exception si ce n'est pas le cas, garantissant ainsi une sécurité de type appropriée.
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!