Re: run time failed with multi inheritence
On Jul 13, 2:10 am, "Alf P. Steinbach" <al...@start.no> wrote:
* ManicQin:
hello I've got a "run time check failed" concerning multi inheritence.
lets say i have interface A
{
virtual foo() = 0
}
and I have interface I1 nad I2.
class I1
{
virtual goo1() = 0
}
class I2
{
virtual goo2() = 0
}
Next i have a class that implements A
class B : A
{
foo()
}
and at the end the MI:
class C1 : B , I1
{
foo()
goo1()
}
class C2 : B , I2
{
foo()
goo2()
}
so far everything is ok...
if I
A* bla = new C2()
and try to
((I2*)bla)->goo2();
the strangest thing happens... i see the debugger jumping to function
foo()! of C2...
A and I2 are unrelated types, so your nasty C style cast translates to a
reinterpret_cast, which does not adjust the pointer value appropriately.
If you'd restricted yourself to the more safe C++ style casts
(static_cast, dynamic_cast, const_cast, here you'd use static_cast or
dynamic_cast) the compiler would have flagged that conversion as invalid.
Actually, if you'd used dynamic_cast, the compiler wouldn't have
complained, and the run-time would have worked! (static_cast would
indeed complain.)
(Given that all the classes here are polymorphic, dynamic_cast will
run all the way round an inheritance heirarchy for you). Of course,
the OP would need to check the result of dynamic_cast, because if you
write:
A* a = new C2();
I2* i2 = dynamic_cast<I2*>(a);
i2->goo2();
all is well, but if you write:
A* a = new C1();
I2* i2 = dynamic_cast<I2*>(a);
// fine so far, it's just that i2 is now null (there isn't an
// I2 object in a C1 object).
i2->goo2(); // bang!
To go from the A subobject to the I2 subobject you need to first go down
to the C2 complete object, then up to the I2 subobject.
Agreed. It's just that dynamic_cast will do that for you.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]