Вы должны знать тип, из которого был преобразован указатель void. Если вы не знаете динамический тип, то вы должны создать указатель void из указателя на базу. Если вы не знаете тип указателя, из которого был создан пустой указатель, вы не можете использовать пустой указатель.
Учитывая, что указатель void был преобразован из Alpha*
, вы можете преобразовать его обратно, используя статическое приведение:
auto a_ptr = static_cast<Alpha*>(p);
Затем вы можете использовать dynamic_cast
для преобразования в производный тип.
if(auto d_ptr = dynamic_cast<DerivedAlpha*>(a_ptr)) {
// do stuff with DerivedAlpha
В случае, если динамический тип не DerivedAlpha
, динамическое приведение безопасно вернет ноль. Вы не можете динамически отбрасывать от иерархии типов. Поскольку Alpha
и Beta
не связаны какой-либо структурой наследования, они не могут быть динамически преобразованы взаимно.