簡體   English   中英

任何人都可以解釋重新解釋強制轉換在此代碼中的工作方式

[英]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);

由於AB不直接相關,因此會導致編譯器錯誤。 用於

bool z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb));

使您可以比較papb的數值。

運行該程序后,它顯示0,誰能解釋為什么z在此程序中為假?

papb的數值不同。 因此,結果。 您可以使用:

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的子對象Cpb指向B的子對象C 從圖片中可以看到, A子對象和B子對象之間存在偏移。 因此, papb的數值不同。 最可能的不同之處在於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM