Re: dynamic_cast and typeid
Now, I know I could do:
void func(Base *b)
{
if(Foo *f=dynamic_cast<Foo*>(b))
{
// handle Foo
}
....
}
You can't: Base doesn't have any virtual member functions.
Correct, the real code does have virtual functions, I accidentally
left it out in the short example I posted.
But I could also do (I believe)
void func(Base *b)
{
if(typeid(*b) == typeid(Foo))
{
/// handle Foo
}
}
With a polymorphic Base class, yes.
My questions are:
1. Wouldn't the second version be quicker? My understand is that
dynamic_cast has to do more, since it allows you to cast throughout
the hierarchy.
Don't be concerned with micro-efficiency, be concerned with correctness.
And for that, replace the pointer argument with a reference argument.
Unless you really want to support "no argument" and that's the only way
to do it.
Yes, good advice. I will change it. I usually try to use references
but this was some existing code.
2. Regardless of the two implementations above, can you think of a
better solution? I hate to do this typeid comparison or a
dynamic_cast in every call. Ideally:
void func(Base *b);
void func(Foo *f);
Generally, use virtual member functions instead of explicit type
discrimination.
Yes, normally I would do this but in this case I have no control over
the objects. They actually represent messages received over a network
and by the time I receive them they are already in the form they are,
and I can not modify the legacy code.
In some cases you'll need to use visitor pattern.
Thanks, will take a look at this.
But don't jump on that wagon willy-nilly; first check whether a simple
introduction of some suitable virtual member functions in Base would do
the trick. Because that's generally what virtual member functions are
for. Namely treating objects polymorphically at run time.