【问题标题】:Can anyone explain how reinterpret cast is working in this code谁能解释一下 reinterpret cast 在这段代码中是如何工作的
【发布时间】:2015-10-08 05:47:27
【问题描述】:

阅读以下正在使用的程序 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 在这个程序中是假的??

【问题讨论】:

    标签: c++ reinterpret-cast


    【解决方案1】:

    谁能解释一下 reinterpret cast 在这段代码中是如何工作的

    reinterpret_cast&lt;char*&gt;(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 指向C 的A 子对象,pb 指向C 的B 子对象。从图中可以看出,A 子对象和B 子对象之间存在偏移。因此,pa 和pb 的数值是不同的。最有可能与sizeof(m_i) 不同。

    【讨论】:

    • @R Sahu 为什么 pa 和 pb 的值会不同。它们具有相同的 c (&c) 值地址
    • 我不认为bool z = (pa == pb); 会编译,因为A 和B 不会相互派生,因此A* 指针不能直接与B* 指针进行比较无需将它们转换为通用数据类型,在本例中为 char*。
    【解决方案2】:

    reinterpret_cast 与这里的 static_cast 相同。 reinterpret_cast 发生在运行时,而 static_cast 发生在编译时。在这种情况下没有区别,但是如果将强制转换应用于对象 c,则会有所不同。

    A* pa = &reinterpret_cast<A&>(c); 
    B* pb = &reinterpret_cast<B&>(c); 
    

    会使 pa 和 pb 相同。虽然您编写的内容有效地执行了 implicit 静态转换:

    A* pa = &static_cast<A&>(c); 
    B* pb = &static_cast<B&>(c);
    

    而且由于这使得 pa 和 pb 不同,它们以后被“重新解释”并不重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-24
      • 2017-04-22
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多