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 :
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!