Re: Problem with static downcast of base type to derived type
On 2008-07-02 21:13, Dom Jackson wrote:
I have a program which crashes when:
1 - I use static_cast to turn a base type pointer into a pointer to a
derived type
2 - I use this new pointer to call a function in an object of the
derived type
3 - this function then 'grows' the derived type object (by pushing
onto a vector).
Is this actually possible, or should I be doing something else? In
more detail, what I'm doing is (there's a complete test program below,
which crashes):
1 - I have a base class which doesn't do very much;
2 - I declare a derived class with public inheritance from the base
class;
3 - the derived class has a method which pushes onto a vector in the
derived class;
4 - I create an STL set of base class objects;
5 - I then insert an object of the derived class into this set. I use
the set 'insert' method, which returns an iterator to the new object
in the set, but this is an iterator to a *base* object (I hope)
6 - I convert the iterator to a pointer, and static_cast the pointer
to a pointer to an object of the derived class
7 - I call my new method via this pointer, pushing onto the vector in
the derived-class-object. Bang.
This will not work, std::set holds objects of the type given as a
parameter, in this case base-objects and not derived objects, the
derived objects will be sliced into base objects. So what you are doing
is trying to call a function which does not exist to manipulate a vector
that does not exist.
To solve your problem you could use a set of pointers to base instead of
a set of base (e.g. std::set<Base*> instead of std::set<Base>) and
create the objects using new (e.g. set.insert(new Derived());).
Besides that, when casting from base to derived you should use
dynamic_cast and check if the cast succeeded (in which case the returned
pointer will be non-0). If you do that in your code you will notice that
you will always get a 0-pointer. A cast from pointer to base class to a
pointer to derived is only allowed if the object pointed to is of type
derived.
You can always cast from pointer to derived to pointer to base using
static_cast, but when going the other way you shall use dynamic_cast.
--
Erik Wikstr??m