Вам нужно выделить объекты из кучи с помощью 'new'. Здесь происходит то, что вы создаете временные объекты, берете указатель на эти объекты, а затем эти объекты уничтожаются. Да, это отличается от многих других языков. :)
Вместо этого попробуйте:
int main() {
const int num = 5; // How many of each to make
std::vector<Entity*> t;
for(int i = 0; i < num; i++) {
Monster* m = new Monster;
t.push_back(m);
}
for(int i = 0; i < num; i++) {
Buddha* b = new Buddha;
t.push_back(b);
}
for(int i = 0; i < t.size(); i++) {
t[i]->func();
}
// This is very important!
for(int i = 0; i < t.size(); i++) {
delete t[i];
}
return 0;
}
Когда вы видите странное поведение, подобное этому, проверьте, чтобы увидеть содержимое фактического вектора. Вы обнаружите, что все ваши слоты имеют одинаковое значение, то есть место в стеке, которое содержит временного монстра, а затем временного Будду.