Downcasting with Static_cast in C
Downcasting is a technique used in object-oriented programming to cast a base class pointer or reference to a derived class pointer or reference. In C , this can be achieved using the static_cast operator.
Consider the following code example:
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(); }
In this example, a pointer of type Base is created and initialized with an object of type Base. The sizeof operator returns 4, indicating the size of the Base object.
However, when we attempt to cast b to a pointer of type Derived using static_cast and assign it to d, the size of *d becomes 8, which is the size of a Derived object. This behavior is unexpected, as we would typically expect the size of *d to be the same as that of *b.
The reason for this behavior lies in the concept of undefined behavior (UB). Using static_cast to cast an object to a type it does not actually have yields UB. In this case, b points to a Base object, not a Derived object. Static_cast cannot change the underlying type of the object, and therefore the result of the cast is undefined.
The C standard, in section 5.2.9 ([expr.static.cast]), specifies the rule for downcasting using static_cast: "If the prvalue of type 'pointer to cv1 B' points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. Otherwise, the result of the cast is undefined."
In this case, the Base object pointed to by b is not a subobject of a Derived object, and therefore the result of the cast is undefined. The symptoms of UB can vary widely, and there is no guarantee that the derived member function (func_d) can be called successfully.
The above is the detailed content of When is using `static_cast` for downcasting in C undefined behavior?. For more information, please follow other related articles on the PHP Chinese website!