了解reinterpret_cast

时间:2019-07-04 17:32:20

标签: c++ operator-keyword reinterpret-cast

即使由类B分配的内存不足以托管类A的所有成员,以下程序也可以正常运行。

// CPP code to illustrate the pointer reinterpret
#include <iostream>
using namespace std;

class A {
public:
    void fun_a()
    {
        cout << " In class A\n";
    }
    int Val;
    int Res;
};

class B {

};

int main()
{
    // creating object of class B
    B* x = new B();

    A* new_a = reinterpret_cast<A*>(x);

    // accessing the function of class A
    new_a->fun_a();
    new_a->Val = 10;
    new_a->Res = 20;

    cout << new_a->Val;
    cout << new_a->Res;

    return 0;
}

3 个答案:

答案 0 :(得分:5)

通过不指向类型为T(或兼容类型)的对象的指向T的指针进行间接操作会导致不确定的行为。

  

以下程序运行没有问题,

似乎没有任何问题的情况下运行的程序是未定义行为的示例。

答案 1 :(得分:1)

您的代码调用 Undefined Behavior (UB),这意味着它可以按您期望的方式工作(例如,今天在您的计算机中),但 保证。

您是正确的,认为此代码是不正确的,并且您只是(不幸地)幸运地发现它“可以在您的计算机上工作”!

答案 2 :(得分:0)

这是未定义的行为。当我们知道它是安全的时,我们应该使用reinterpret_cast。 例如,您要使用套接字编程发送对象。在那里,Api将数据作为字符缓冲区,因此您可以在其中使用它作为 A * new_a =新的A(); char * new_Data = reinterpret_cast(new_a); 在接收端,您必须使用通过reinterpret_cast进行的反转操作,但这一次是从char *到A *; 当您知道它很安全时,这就是一种情况。