Maison >développement back-end >C++ >Pourquoi `static_cast` vers un pointeur dérivé semble-t-il accéder à l'intégralité de l'objet dérivé en C lorsque le pointeur d'origine pointe vers un objet de classe de base ?

Pourquoi `static_cast` vers un pointeur dérivé semble-t-il accéder à l'intégralité de l'objet dérivé en C lorsque le pointeur d'origine pointe vers un objet de classe de base ?

DDD
DDDoriginal
2024-11-26 15:20:10285parcourir

Why Does `static_cast` to a Derived Pointer Seem to Access the Entire Derived Object in C   When the Original Pointer Points to a Base Class Object?

Downcasting avec Static Cast en C

En C , le downcasting fait référence à la conversion d'un pointeur ou d'une référence de classe de base en un pointeur ou une référence de classe dérivée. Une façon d'effectuer un downcasting consiste à utiliser l'attribut static_cast<> opérateur.

Considérons le code suivant :

class base {
    base();
    virtual void func();
};

class derived : public base {
    derived();
    void func();
    void func_d();
    int a;
};

int main() {
    base *b = new base();
    sizeof(*b); // Gives 4.
    derived *d = static_cast<derived*>(b);
    sizeof(*d); // Gives 8- means whole derived obj size..why?
    d->func_d();
}

Dans cet exemple, nous avons une classe de base base et une classe dérivée dérivée. Nous créons un pointeur de classe de base b pointant vers un objet de type base. En utilisant static_cast<>, nous essayons de convertir b en un pointeur de classe dérivée d.

La question déroutante ici est de savoir pourquoi le pointeur de classe dérivée d a accès à l'intégralité de l'objet de classe dérivée, bien que b pointe vers une base. class object.

Cependant, il est crucial de comprendre que l'utilisation de static_cast<> lancer un pointeur vers un type auquel il n'appartient pas est considéré comme un comportement non défini en C .

Selon le standard C ([expr.static.cast]), un statique la conversion en un pointeur de classe dérivé à partir d'un pointeur de classe de base n'est autorisée que si les conditions suivantes sont remplies :

  1. Il existe une conversion standard valide de "pointeur vers D" vers "pointeur vers B" (où D est la classe dérivée et B est la classe de base).
  2. B n'est pas une classe de base virtuelle de D ou une classe de base d'une classe de base virtuelle de D.
  3. Si l'objet de classe de base pointé est en fait un sous-objet d'un objet de classe dérivé, le pointeur résultant doit pointer vers l'objet de classe dérivé englobant.

Si l'un de ces éléments les conditions ne sont pas remplies, le résultat de la conversion est indéfini.

Dans le code donné, puisque b pointe vers un objet de classe de base pur, il n'y a pas d'objet de classe dérivé englobant vers lequel pointer. Par conséquent, le comportement du programme devient imprévisible et il ne faut pas s'y fier.

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