任何人都可以解释重新解释强制转换如何在此代码中工作

luc*_*uck 1 c++ reinterpret-cast

阅读以下使用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;
}
Run Code Online (Sandbox Code Playgroud)

运行此程序后,它打印0,任何人都可以解释为什么z在这个程序中出现错误?

R S*_*ahu 5

任何人都可以解释重新解释强制转换如何在此代码中工作

reinterpret_cast<char*>(pa)求值为类型char*的指针,其数值与其相同pa.用于:

bool z = (pa == pb);
Run Code Online (Sandbox Code Playgroud)

导致编译器错误,因为AB没有直接相关.用于

bool z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb));
Run Code Online (Sandbox Code Playgroud)

可以让你比较的数值papb.

运行此程序后,它打印0,任何人都可以解释为什么z在这个程序中出现错误?

数值papb不相同.因此,结果.您可以使用:

cout << "pa: " << std::hex << (void*)pa << std::endl;
cout << "pb: " << std::hex << (void*)pb << std::endl;
Run Code Online (Sandbox Code Playgroud)

打印这些价值观并说服自己不一样.

如果你看一下a的内存布局C,它看起来像:

+------+
|  m_i |     // The A sub-object
+------+
|  m_d |     // The B sub-object
+------+
|  m_c |     
+------+
Run Code Online (Sandbox Code Playgroud)

当你使用

C c;
A* pa = &c;
B* pb = &c;
Run Code Online (Sandbox Code Playgroud)

pa指向A子对象Cpb指向B子对象C.从图中可以看出,A子对象和B子对象之间存在偏移.因此,数值papb不同.最有可能的是sizeof(m_i).