Re: Problem with multiple inheritance
On Sat, 28 Feb 2009 14:40:47 -0000, Daniel James
<wastebasket@nospam.aaisp.org> wrote:
You weren't far wrong with your own attempt, though. It would have
worked if you'd done the casting differently:
void MyFunction(A *myObject)
{
// here myObject is a pointer of type A* that actually
// points to either an AB or an ABC
Assumes facts not in evidence. The myObject pointer could point to some
class derived from A that MyFunction has never heard of, or even an A, if A
is not abstract.
if( myObject->InheritsFromC() )
{
// Now we know that myObject is actually an ABC*
ABC* pObj = dynamic_cast<ABC*>(myObject);
pObj->I_Am_From_C();
}
else
{
// here myObject is actually an AB*
Assumes facts not in evidence.
}
}
This is not quite as simple as the RTTI example given by others, but it
works even with RTTI not enabled. It's your choice.
It doesn't make any sense to use dynamic_cast with RTTI disabled. He ought
to use static_cast for the pattern you presented.
Important points to note are:
1. Cast to ABC* not to C*. If you really want a C* pointer you must
cast first to ABC* then cast a second time to C*.
That's doing class hierarchy navigation by hand. The appropriate cast for
this is static_cast.
2. Use a C++ dynamic cast here because you are using the cast to get a
pointer to a related class within the class hierarchy. ABC is related
to A (but C is not) so a dynamic cast will work
It doesn't make any sense to use dynamic_cast with RTTI disabled. He ought
to use static_cast for the pattern you presented.
the compiler will
give an error if you try to dynamic_cast between things that are not
related.
No, it will not. It will for static_cast, though. The whole point of
dynamic_cast is to make the determination at RUN-TIME. If the dynamic_cast
fails, and the destination type is a pointer type, the result is NULL, and
if the destination type is a reference type, std::bad_cast is thrown.
A C style cast will have the same effect as a dynamic_cast if you
specify the types correctly, and so will work, but if you get the types
wrong (as you did) it will act as a reinterpret_cast without the
compiler giving any warning. Avoid the C style cast.
A C-style cast amounts to a dynamic_cast only for those cases for which
static_cast could have /correctly/ been used instead of dynamic_cast. In
particular, it can't do the class hierarchy navigation that dynamic_cast is
capable of, and it cannot work for the cross cast the OP was attempting
(except through multiple casts, none of which perform RTTI).
It seems to me that if you s/dynamic_cast/static_cast/, your message would
be a lot more correct. :)
--
Doug Harrison
Visual C++ MVP