Strategy[N] хранит не наследников Strategy, а объекты класса Strategy. Поэтому в массиве придётся хранить не тела объектов, а указатели.
Если у вашего МК есть полноценное управление памятью с операцией new, всё просто:
std::unique_ptr<Strategy> strategies[N]
. Если нет — приходится как-то извращаться, и об этом не будем.
Как сериализировать? Добавим классу Strategy небольшую функцию
unsigned char code() const;
Пусть первая стратегия возвращает, например, 1=CODE_DUPLICATE, а вторая — 2=CODE_MACRO. Сериализация, в числе прочего, будет записывать в память эти коды.
Считав код, мы создаём Duplicate или Macro, а затем считываем объект этого класса.
std::unique_ptr<Strategy>& thatObject = strategies[i];
switch (getSomeByte) {
case CODE_DUPLICATE:
thatObject = new DuplicateStrategy();
break;
case CODE_MACRO:
thatObject = new MacroStrategy();
break;
default:
// можно ничего не делать. Можно сообщить об ошибке.
}
thatObject->read();