Может ли кто-нибудь объяснить, как в этом коде работает переинтерпретация приведения?
reinterpret_cast<char*>(pa)
оценивается как указатель типа char*
, числовое значение которого такое же, как у pa
. Использование:
bool z = (pa == pb);
приводит к ошибке компилятора, поскольку A
и B
не связаны напрямую. Использование
bool z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb));
позволяет сравнить числовые значения pa
и pb
.
После запуска этой программы она печатает 0, кто-нибудь может объяснить, почему в этой программе z становится ложным??
Числовые значения pa
и pb
не совпадают. Отсюда и результат. Вы можете использовать:
cout << "pa: " << std::hex << (void*)pa << std::endl;
cout << "pb: " << std::hex << (void*)pb << std::endl;
чтобы напечатать эти значения и убедить себя, что они не совпадают.
Если вы посмотрите на структуру памяти C
, она выглядит примерно так:
+------+
| m_i | // The A sub-object
+------+
| m_d | // The B sub-object
+------+
| m_c |
+------+
Когда вы используете
C c;
A* pa = &c;
B* pb = &c;
pa
указывает на подобъект A
объекта C
, а pb
указывает на подобъект B
объекта C
. Как видно из рисунка, между подобъектом A
и подобъектом B
есть смещение. Следовательно, числовые значения pa
и pb
различны. Скорее всего отличаются на sizeof(m_i)
.
person
R Sahu
schedule
08.10.2015