Вы должны поработать над фрагментом кода немного больше.
GetSomethingCopy создает указатель типа Class2, который передается в CopyTo. CopyTo пытается вызвать функцию-член полученного указателя, который никогда не был инициализирован: ошибка сегментации, и программа умирает.
Даже если это не убило приложение, вы пытаетесь dynamic_cast из Class2 * в Class2 *, что почти ничего не делает. Если вы намереваетесь привести возвращаемое значение из CopyTo, вы должны знать, что вы не можете использовать dynamic_cast для void *. Вы должны либо изменить подпись CopyTo, чтобы она возвращала Class1 (чтобы потом можно было ее разыграть), либо использовать static_cast для void *.
Обратите внимание, что либо Copy является виртуальной функцией в Class1, которая фактически выполняется в Class2 и создает объект Class2, либо возвращаемый элемент не будет Class2, а скорее Class1.
Название метода CopyTo сбивает с толку, поскольку он не копирует в аргумент, а скорее из аргумента.
И после всего этого я до сих пор не знаю, о чем вы спрашиваете. Где бы вы хотели использовать стековую память? Вы можете передать выделенный элемент стека в функцию, но возврат указателя / ссылки на выделенный элемент стека снова является ошибкой сегментации: объект будет уничтожен, когда функция завершится, а получатель останется с висящим указателем / ссылкой.
Теперь, если ваш вопрос более теоретический относительно того, можете ли вы использовать dynamic_cast для выделенного стека элемента, вы можете (при условии, что Class2 наследует от Class1):
void f()
{
Class2 c2;
Class1 &c1 = c2; // c1 is a Class1 reference to a Class2 object
dynamic_cast<Class2&>(c1).class2method();
// or:
dynamic_cast<Class2*>(&c1)->class2method();
}
Если вы обновите код, оставьте комментарий в этом ответе, чтобы я заметил и смог исправить его сегодня вечером.