Как располагаются в памяти элементы массива обьектов класса?
Объекты в C++ имеют постоянный размер, известный на этапе компиляции и равный sizeof(экземпляр)

Утверждение:
 объект класса может содержать и вектор ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.
неверно, так как вектор хранит свои данные не в своем экземпляре, а туда, куда их засунет аллокатор (обычно засовывает на кучу).

Утверждение:
[объект класса] и шаблонным может быть ... а значит разные элементы массива(объекты класса) могут занимать разное количество байт в памяти.
неверно, так как все шаблоны конкретизируются на этапе компиляции.

Следовательно, объекты класса сидят в массиве друг за дружкой, имеют фиксированный размер, и по ним можно ползать указателем, сдвигая его на этот размер.
Отличный вопрос!

Проблема есть, но она немного в другой плоскости, которую вы не упомянули - наследование. Т.е. например у вас иерархия классов с одним базовым классом и вы решаете хранить в массиве базовые классы, надеясь, что через базовый класс с помощью виртуальных методов выйдете на функционал наследников.
Так не получится, т.к., действительно, в массиве все объекты имеют одинаковый размер и если вы создаете массив базовых классов, то размер элемента массива будет равен размеру экземпляра базового класса. Так что все экземпляры классов наследников урежутся при помещении в массив.

Как эта проблема решается в с++? 
С++ не решает эту проблему. Эту проблему решаете вы как программист.
Самое простое что приходит в голову - хранить в массиве не сами объекты, а указатели на них или ссылки.
Так же было бы не плохо запретить возможность создавать экземпляры базовых классов, тогда у вас в принципе не будет возможности создать подобный массив.