Using static_cast
to 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):
A prvalue of type “pointer to cv1
B
“, whereB
is a class type, can be converted to a prvalue of type “pointer to cv2D
“, whereD
is a class derived fromB
, if a valid standard conversion from “pointer toD
” to “pointer toB
” exists, cv2 is the same cv-qualification as, or greater cv-qualification than, cv1, andB
is neither a virtual base class ofD
nor a base class of a virtual base class ofD
. The null pointer value is converted to the null pointer value of the destination type. If the prvalue of type “pointer to cv1B
” points
to aB
that is actually a subobject of an object of typeD
, the resulting pointer points to the enclosing object
of typeD
. Otherwise, the result of the cast is undefined.