c
и &d
действительно имеют такое же значение, и если вы переосмысливать отливка c
назад к D*
вы получите правильный указатель, что вы можете разыменования. Кроме того, вы можете обрабатывать c
как (указатель на первый элемент) непрозрачного массива char[sizeof(D)]
- это действительно основная цель указателей каста для указателей на символы: разрешить (де) сериализацию (например, ofile.write(c, sizeof(D));
), хотя обычно вы должны только сделайте это для примитивных типов (и их массивов), поскольку бинарная компоновка составных типов обычно не указывается переносимым образом.
Как @Oli справедливо указывает и хотел бы, чтобы я укрепился, вы никогда не должны сериализовать сложные типы в целом. Результат почти никогда не будет десериализуем, поскольку реализация полиморфных классов и дополнений между полями данных не указана и недоступна для вас.
Обратите внимание, что reinterpret_cast<char*>(static_cast<B*>(&d))
может рассматриваться как непрозрачный массив char[sizeof(B)]
по аналогичным соображениям.
Я думаю, что ваш деструктор неверно назван –
Я не знаю ответа. Но когда это знание ** будет полезно на практике? –
Хороший вопрос. Некоторые приведения могут фактически изменить адрес (например, когда задействовано множественное наследование).Интересно, так ли это. – Kos