Вам нужно будет использовать указатели и использовать конструкторы копирования.Кроме того, не используйте ключевое слово struct
для более чем основных структур данных.Технически это работает, но то, что вы создаете, это иерархия классов, поэтому используйте ключевое слово class
.
Это не будет работать просто потому, что Derived больше, а также для намерений и целей является совершенно другим объектом, которыйсовместим с Base
в основном по интерфейсу, но, что более важно, при работе с классами не следует использовать низкоуровневые манипуляции с памятью.Вместо этого вам следует настроить конструкторы копирования и использовать библиотеки, такие как <алгоритм>, для выполнения шаблонных действий с ними.
Более того, причина, по которой это не будет работать, несмотря на то, что это законноСинтаксис (т. е. Base * = Derived *
) заключается в том, что вы выделяете объекты большего размера, чем индексировал бы Base *
, что может привести к повреждению памяти при записи памяти в неправильное местоположение.
Например, если a Base
объект имеет размер 4 байта, C ++ будет индексировать массив каждые четыре байта, но если фактические выделенные объекты Derived
имеют размер 8 байтов, то вы выполняете индексирование на полпути через границы объекта, и ваши переменные-члены не будут указывать на правильное местоположениев памяти.
Использование иерархий классов в массиве:
Base *objects[100];
for (int i = 0; i < 100; i++)
objects[i] = new Derived();
Еще больше , чтобы упростить управление, вы можете использовать механизм интеллектуальных указателейи список шаблонов вместо необработанных указателей.