Я бы использовал dynamic_cast<>
, так как сохраняемый объект может не иметь тип Derived (это может быть Derived_2, также производный от Base).
func(dynamic_cast<Derived&>(*container.back()).member)
Вы также можете приводить ссылки, чтобы они выглядели немного аккуратнее.
Примечание: dynamic_cast<>
- если используется для приведения указателя, может возвращаться NULL
- если используется для приведения ссылки, может выдать std :: bad_cast
Именно поэтому я предпочитаю использовать dynamic_cast со ссылками обычно. Но если вы используете его с указателем, убедитесь, что результат не NULL, прежде чем использовать его.
Изменить на обновленный вопрос:
Но если я попытаюсь сделать func (static_cast (* container.back ()). Member);
Вы хотите ссылку
static_cast<Derived&>
^^^ Not the & here
Это остановит попытку вызова конструктора. Если вы static_cast <> для Derived, он попытается создать объект. То, что вы действительно хотите, это ссылка.