путь от любого типа на любой другой dynamic_cast. Но для этого требуется, чтобы объект был polymorphic. В общем случае это требует V-таблицу, чтобы быть связаны как A
и B
, так что: , если А и В имеют по меньшей мере одну виртуальную функцию, и RTTI не отключить,
A* pa1 = new C;
A* pa2 = new A;
B* pb1 = dynamic_cast<B*>(pa1);
B* pb2 = dynamic_cast<B*>(pa2);
приведет к Pb2 к be null и pb1, чтобы указать на часть B объекта, содержащую * pa1 в качестве своей части A. (То, что это C или что-то другое, полученное из этих двух оснований, не имеет значения).
В противном случае, когда все должно быть статическим, вы должны пройти через C
B* pb = static_cast<B*>(static_cast<C*>(pa));
Обратите внимание, что static_cast<B*>(pA)
не может скомпилировать, будучи А и В друг с другом не связаны.
Спасибо. Неожиданное поведение - это именно то, что у меня было) – Andrew
Но я не могу понять, почему dynamic_cast прошел нормально – Andrew
@Andrew, 'dynamic_cast' также действителен и будет работать (если классы полиморфны); потому что 'C' действительно является подклассом' A'. Однако в этом случае 'static_cast ' будет лучшей идеей, как это происходит во время компиляции. –
iammilind