Первое явное преобразование из &obj
, то есть Child*
в Parent1*
, является повышением. Результат будет указывать на подобъект базового класса. Следующее явное преобразование из Parent1*
в Parent2*
. Поскольку эти классы не связаны напрямую, это приведение к реинтерпретации. Но типы не являются взаимозаменяемыми по указателю, поэтому при вызове функции через переинтерпретированный указатель поведение программы не определено.
Вам следует избегать использования приведения в стиле C, чтобы предотвратить подобные ошибки. В этом случае явное приведение не требуется вообще. Это работает правильно:
Parent2 * p2 = &obj;
И никогда не переинтерпретируйте указатели, если вы не знаете, что это значит и что это нормально.