Как уже говорили другие, вы испытываете нарезку. vector
хранит Base
, и любая производная информация выделяется.
Облегчите это с помощью указателей:
std::vector<Base*> v;
v.push_back(new A);
v.push_back(new B);
Проблема сейчас в том, чтобы высвободить ваши ресурсы. Прежде чем вектор выйдет из области видимости, вам нужно будет пройти через него и удалить каждый элемент. Еще хуже проблема с исключениями.
Если в любой момент времени существования вектора, если будет сгенерировано исключение, он размотает стек, в какой-то момент освободив все ваши указатели в векторе; одна гигантская утечка памяти.
Если вы используете более выделенный контейнер, вы избежите этой проблемы. Либо напишите один самостоятельно (конечно, не рекомендуется), либо используйте контейнеры с указателем буста .