Boris wrote: > Maxim Yegorushkin wrote: > > [...] > > > > Why not just: > > > > if(level2 const* l2 = dynamic_cast<level2 const*>(&b)) > > { > > // no need comparing typeinfo's > > } > > > > ? > > I want to cast to a level 1 class which is a parent of several level 2 > classes. Otherwise you are right - I could cast to the actual type directly. > The real code looks more like this: > > if (typeid(b) == typeid(level2a) || typeid(b) == typeid(level2b) || > typeid(b) == typeid(level2c)) > { > const level1 *l1 = dynamic_cast<const level1*>(&b); > } > > Class level1 is the parent of all the level2 classes. I have to check for > several types but don't need to write the same code then at least for all > the level2 classes.
I would redesign my hierarchy so, that dynamic_cast would be enough. > >> It looks like a problem with g++. The code I was talking about is in > >> a shared library. When I link the executable statically dynamic_cast > >> works. When I use however the shared library dynamic_cast returns 0. > >> Same code but different behavior due to linking. > >> > >> There is a section "dynamic_cast, throw, typeid don't work with > >> shared libraries" at http://gcc.gnu.org/faq.html#dso. > > > > I wonder how you reached such a conclusion. Where on that page do they > > say it does not work? > > The title is pretty clear I think: "dynamic_cast,throw, typeid don't work > with shared libraries". :-) They are talking about template instantiations, > vague linkage, not an exhaustive list, namesspaces etc. This all doesn't > sound like adding a linker switch fixes all your problems. This sounds like > be ready for all kind of problems. This is a title of a frequently asked question. The answer is given fow to make it work. If you can follow the first advise, which is <q> For a program which is linked against a shared library, no additional precautions are needed </q> then no other action is required. > Anyway if I can downcast to the actual type and then back to its parent with > the following code (no compilation error, no runtime error) why should a > dynamic_cast to the parent l1 not work? > > if (typeid(b) == typeid(level2)) > { > const level2 *l2 = dynamic_cast<const level2*>(&b); > const level1 *l1 = l2; > } You could find more help if you posted simplified complete code that reproduces what you are observing. It might be that you derive privately from your base (class A : B {};) . dynamic_cast in this case does not work, reinterpret_cast does work if your base class is first in the list of the base classes. _______________________________________________ help-gplusplus mailing list help-gplusplus@gnu.org http://lists.gnu.org/mailman/listinfo/help-gplusplus