Chazz
Chazz

Reputation: 461

Casting with multiple inheritance

If you have a void* pointer to Derived class that inherits from both BaseA and BaseB, how does the compiler cast the void* pointer to BaseA* (or BaseB*) without knowing that the void* pointer is of type Derived?

Upvotes: 6

Views: 2378

Answers (2)

James McNellis
James McNellis

Reputation: 354979

It doesn't. The only guarantee when casting to and from a void* using a static_cast is:

A value of type pointer to object converted to "pointer to cv void" and back to the original pointer type will have its original value (C++03 §5.2.9/10).

For example, the following code is incorrect because the void* is cast to a type other than the original pointer type (the cast sequence is B1* -> void* -> B2*):

struct B1 { int i; };
struct B2 { int j; };

struct D : B1, B2 { };

D x;
B1*   b1ptr   = &x;
void* voidptr = b1ptr;
B2*   b2ptr   = static_cast<B2*>(voidptr);

Attempting to use b2ptr here would result in undefined behavior. The only type to which you can safely cast voidptr is B1*, since that is the type from which the void* was obtained (well, or to a char*, since anything can be accessed via a char*).

Upvotes: 5

Tyler McHenry
Tyler McHenry

Reputation: 76640

The compiler doesn't cast the void* pointer to anything -- you, the programmer, do.

In order to do anything useful with a void* pointer, you need to explicitly cast it to a non-void* pointer, and if you're wrong about what type the pointer actually points to, you enter Undefined Behavior City.

Upvotes: 3

Related Questions