Почему размер объекта не совпадает?
1) Не следует допускать торчания из классов полей с данными - все поля, кроме, быть может, констант, следует делать приватными.
2) В таком случае, у ваших классов появятся методы для доступа к этим полям, которые нужно будет объявить виртуальными
3) Вместо хранения экземпляров в векторе объектов, следует сделать вектор из умных указателей на эти объекты
4) Базовый класс для этих объектов желательно сделать абстрактным, на худой конец - интерфейсным. 

После этого, ваша гомологическая иерархия классов станет вести себя так, как вы этого хотите.
Создавать объекты виртуальных классов следует только через:
std::vector<std::unique_ptr<object>> world;

auto terr = std::make_unique<Terrain>();
world.push_back(std::move(terr));
Или:
world.push_back(std::make_unique<Terrain>());

Чтобы устранить утечку памяти, которая сейчас присутствует в коде, нужно обязательно добавить в object:
object& operator=(object&&) = delete;
virtual ~object() = default;