[英]Can anyone explain how reinterpret cast is working in this code
閱讀以下使用reinterpret_cast的程序。
#include <iostream>
class A
{
public:
A() : m_i(0) { }
protected:
int m_i;
};
class B
{
public:
B() : m_d(0.0) { }
protected:
double m_d;
};
class C : public A , public B
{
public:
C() : m_c('a') { }
private:
char m_c;
};
int main()
{
C c;
A *pa = &c;
B *pb = &c;
bool z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb));
std::cout << z;
return 0;
}
運行該程序后,它顯示0,誰能解釋為什么z在此程序中為假?
任何人都可以解釋重新解釋強制轉換在此代碼中的工作方式
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)
。
reinterpret_cast與此處的static_cast相同。 reinterpret_cast在運行時發生,而static_cast在編譯時發生。 在這種情況下沒有什么區別,但是如果將強制轉換應用於對象c則會有所不同。
A* pa = &reinterpret_cast<A&>(c);
B* pb = &reinterpret_cast<B&>(c);
會使pa和pb相同。 盡管您有效地編寫了內容,但隱式進行了靜態強制轉換:
A* pa = &static_cast<A&>(c);
B* pb = &static_cast<B&>(c);
並且由於這使pa和pb不同,因此以后“重新解釋”它們也沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.