Maison >développement back-end >C++ >Quand le downcasting en C est-il sûr et quand conduit-il à un comportement non défini ?

Quand le downcasting en C est-il sûr et quand conduit-il à un comportement non défini ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-29 18:32:10287parcourir

When is Downcasting in C   Safe, and When Does it Lead to Undefined Behavior?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn