Re: Multiple inheritance and pointer equivalence
* Juha Nieminen:
Alf P. Steinbach wrote:
So,
since they have virtual members you can just do dynamic_cast<void*>(a)
== dynamic_cast<void*>(b). :-)
Why would that work? How can you even dynamic-cast to void*? What
would that even *mean*?
It gives you the address of the most derived object[1].
You can do it because the Holy Standard says so.
And that also formally answers why it would work, but the in-practice answer for
that also involves "because if you're using a compiler like MSVC then you have
provided the options that make it mostly standard-compliant, in particular
turning on RTTI support".
Anyways, it's much easier to do it like:
if(a == dynamic_cast<A*>(b)) ...
I find the simple downcasts more clear, and the cross-cast a bit challenging.
And apart from clarity, there is the academic problem that the cross-cast may
not be valid, e.g. in the case where a C contains two or more A sub-objects.
So I just provided the way that I found most clear, and guaranteed to work. :-)
Cheers & hth.,
- Alf
Notes:
[1] The special case casts in C++ include dynamic_cast<void*>, C style cast to
otherwise inaccessible base, reinterpret_cast to/from first data member of a
POD, and reinterpret_cast<char&> (he he...) to obtain address of object of silly
class that redefines address operator, but although the latter works in practice
I think that for non-POD it's formally UB or implementation defined behavior?