Polymorphism only works with non-value types: references and pointers. And since references can only be bound once, you cannot really use them in standard containers. That leaves you with pointers.
You’re attacking the problem at the wrong end. If you are concerned about the overhead of allocating lots of small objects (and I’m assuming that this is a legitimate concern. That is, you have actual profiling data or sufficient experience to know it is a concern for your specific application), then you should fix that. Change how you’re allocating memory for these objects. Make a small allocation heap or something.
Admittedly, pre-C++0x’s allocators are somewhat lacking in this regard, since they have to be stateless. But for your purposes, you should be able to deal with it.
From your edit:
That is a terrible idea. Erasing from a
std::deque at anywhere but the start or end will invalidate every pointer in your
Given your comment, this idea is functional. However, having all of these different memory blocks for different kinds of objects seems to go against the whole point of inheritance. After all, you can’t just write a new type of
Animal and slip it into the
std::list; you have to provide memory management for it.
Are you sure that inheritance-based polymorphism is what you need here? Are you sure that some other methodology would not work just as well?