Re: Problem with multiple inheritance
On Tue, 24 Feb 2009 16:38:21 +0100, No_Name <no_mail@no_mail.com> wrote:
Hello,
I work on an application with multiple inheritance. I work with Visual
C++ 2005 & Windows CE.
I have a class named A.
I have a class named AB which inherits from A.
I have a class named C.
Class C has a function I_Am_From_C().
I have a class named ABC which inherits from AB and from C.
Class AB has a function InheritsFromC() which gives false;
Class ABC has a function InheritsFromC() which gives true;
I am trying to write generic C++ code to be able to deal with my
classes.
In my code, O is an object coming from another function. It can be an
AB or an ABC object.
I write the following :
void MyFunction(A *myObject)
{
C *mySecondObject;
if (myObject->InheritsFromC() == true)
Get rid of the comparison to true. It is much better style to test boolean
expressions as if (x) and if (!x), and when dealing with non-C++ bool
types, e.g. typedefs for int, it may even be necessary, as non-zero may be
considered true. Also, it would be better to use reference parameters here.
{
mySecondObject = (C *)myObject;
mySecondObject->I_Am_From_C();
}
}
but when I make this code run, the calling of the I_Am_From_C()
function crashes, and in debug I can see that the C object named
mySecondObject is not correctly initialized (all his parameters have
random values).
Isn't it a good way to manage myObject when it inherits from C ? Can
you help me with a better way to be able to call the I_Am_From_C()
function from myObject where it effectively inherits from C ?
Thank you very much !
I don't know if the WinCE compiler supports it, but the best way would be
to get rid of this RTTI simulation and use real RTTI and dynamic_cast. You
didn't mention this, but I presume class A has a (pure) virtual function
"InheritsFromC"? (That's why you need real RTTI; it's inconvenient to keep
adding such functions to A every time you derive a new class.) I don't see
how it's going to work. If I understand you correctly, your inheritance
hierarchy is:
struct A
{
virtual bool f() = 0;
};
struct AB : A
{
bool f() { return false; }
};
struct C
{
// NB: Does not override A::f, so is irrelevant.
bool f() { return true; }
};
struct ABC : AB, C
{
bool f() { return true; }
};
As C is not derived from A, there is no conversion from A to C, so your
cast is bogus. Your C-style case amounts to a reinterpret_cast, while if
you had used the correct new-style cast, static_cast, the compiler would
have caught your mistake.
It appears to me you're attempting to do a cross-cast from A to C, which
amounts to navigating sideways through a class hierarchy. You can do that
with dynamic_cast. The only way it's going to work without dynamic_cast is
for your bool-returning function to return a C*. Then the hierarchy would
look something like:
struct C;
struct A
{
virtual C* f() = 0;
};
struct AB : A
{
C* f() { return 0; }
};
struct C
{
};
struct ABC : AB, C
{
C* f() { return this; }
};
You still can't cast an A to a C, but you can use the C* returned by A::f.
--
Doug Harrison
Visual C++ MVP