Consider:
class base
{
base();
virtual void func();
}
class derived : public base
{
derived();
void func();
void func_d();
int a;
}
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();
}
In the above code I did downcasting of a base pointer which points to base object to derived class pointer. I am wondering how the derived pointer has the whole derived class object. I can call the derived class function (declared in derived class only). I did not get the concept here.
Using
static_castto cast an object to a type it doesn’t actually have yields undefined behavior. The symptoms of UB vary widely. There’s nothing that says UB can’t allow the derived member function to be called successfully (but there’s nothing that guarantees that it will, so don’t count on it).Here is the rule for downcasting using
static_cast, found in section 5.2.9 ([expr.static.cast]) of the C++ standard (C++0x wording):