重新解释为不同类型的 C++

Reinterpret cast to different type C++

在阅读 Reinterpret cast 时,我检查了以下代码。

class Type1 {
public:

    Type1() {
        a = "Class Type 1";
    }
    void get1()
    {
        std::cout << a;
    }
private:
    std::string a;
};

class Type2 {
public:
    
    Type2() {
        b = "class Type 2";
    }

    void get2()
    {
        std::cout << b;
    }
private:
    std::string b;
};

int main()
{
    
    Type1* type1 = new Type1();

    //converting Pointer
    Type2* type2 = reinterpret_cast<Type2*>(type1);

    // accessing the function of class A 
    type2->get2(); 
}

在 运行 下面的代码之后它在​​控制台中打印 "Class Type 1"

现在 type1Type1 类型的指针,我将其转换为 Type2 并存储在 type2 中。 现在,当我调用 type2->get2(); 时,它是打印实例化 Type1 的数据成员 a 还是编译器正在动态更改函数?

与以下代码类似。

#include <iostream> 
using namespace std; 
  
class A { 
public: 
    void fun_a() 
    { 
        cout << " In class A\n"; 
    } 
}; 
  
class B { 
public: 
    void fun_b() 
    { 
        cout << " In class B\n"; 
    } 
}; 
  
int main() 
{ 
    // creating object of class B 
    B* x = new B(); 
  
    // converting the pointer to object 
    // referenced of class B to class A 
    A* new_a = reinterpret_cast<A*>(x); 
  
    // accessing the function of class A 
    new_a->fun_a(); 
    return 0; 
}  

如何打印“In class A”?因为我实例化了 Class B ?

您正在做的是未定义的行为。没有正确答案。

在 C++ 中,在两种类型的不相关层次结构之间使用 reinterpret_cast 所产生的 pointer/reference 是非法的——因此,从此类生成的任何代码都无法进行推理。

对于未定义的行为,编译器可以自由地对无效代码执行它希望的操作。您遇到的情况可能会因编译器、优化级别和目标不同而有所不同 architecture/system.

您在代码中使用了转换 reinterpret_cast

这种转换只是告诉编译器考虑指向不同的类型,而不考虑类型。 reinterpret_cast 是C++中最不注意目的和源数据排列的非法转换。它只是将值从一种类型转换为另一种类型。