reinterpret_cast
нельзя использовать, чтобы делать то, что вы пытаетесь сделать. reinterpret_cast
из void*
в T*
создает указатель на действительный T*
, только если указанный void*
указатель был указателем на объект типа T
.
Выполнение dynamic_cast<void*>(p)
возвращает void*
, которое указывает на наиболее производный объект, на который указывает p
. Поскольку ваш &a
на самом деле является самым производным объектом, на который он указывает, он просто преобразует указатель в void*
.
Затем вы выполняете reinterpret_cast<any_class*>
для этого void*
. void*
указывает на объект типа child_class_good<32>
или child_class_bad<32>
. Ваш актер говорит, что указатель на самом деле указывает на any_class
. Это неверно (ни один тип не является стандартным макетом, поэтому макет базовых классов не определен), и поэтому попытка использовать результаты приведет к неопределенному поведению.
Случай, который вы идентифицируете как good
, так же недействительно, как bad
; просто случается с работой.
Неясно, почему вы пытаетесь делать то, что вы пытаетесь сделать, но нет действительного способа взять void*
указание на наиболее производный объект неизвестного типа и приведение его к чему-либо полезному. Чтобы использовать void*
, вы должны знать точный тип, который использовался для производства этого void*
.