C++ 类型将 int * 转换为 class

Gee*_*Kay 5 c++ casting

可能的重复:
常规强制转换、静态强制转换、动态强制转换
未定义、未指定和实现定义的行为

我面临一个奇怪的问题。在下面的代码片段中我定义了一个类

   class NewClass
   {
      public:
         void Test()
         {
             cout<<"NewClass Test"<<endl;
         }
   };
Run Code Online (Sandbox Code Playgroud)

在我的 main() 方法中,我写道:

        void main()
        {
           int *ptr = new int();
           NewClass *n = ((NewClass *)ptr);
           n->Test();
        }
Run Code Online (Sandbox Code Playgroud)

它显示“NewClass Test”。我不明白如何将任何指针类型转换为 NewClass 并且仍然可以工作。

提前致谢!

jus*_*tin 3

这就是静态调度的作用。this在这种情况下确实没有必要(例如,在 中不使用或依赖它NewClass::Test())。

强制NewClass *n = ((NewClass *)ptr);转换是按地址进行类型转换,并且在此上下文中没有类型检查。换句话说,您不是在任何地方创建新实例,您只是将 指定地址NewClass处的内存视为. 这是一种危险的转换,应该避免。如果您需要通过类型安全丢失的地址(例如)传输对象,请始终确保两端都知道发送和接收的内容。幸运的是,擦除类型安全性正变得越来越不常见。int*NewClass*void*

结果是未定义的,但在大多数情况下您应该预料到会产生不良副作用,并且您应该不惜一切代价避免重新解释数据。

在这种情况下,编译器可能会插入结果,因为它知道它们。此外,没有出现错误,因为在这种情况下不存在对对象的地址或状态的实际依赖:Test()不依赖于 的 state/data/members/dynamicmethods/vtable this

如果您要添加诸如std::strings之类的成员NewClass并打印这些成员...您可以预期事情会比现在更快地爆发:)

如果危险并不明显:这是一个极其危险的转换——所有由 所支持的数据都int*被重新解释为NewClass*,并且其所有内部存储器和结构(例如 vtable 和 magic cookies)都相应地被重新解释。用不了多久,你的程序就会出现段错误,要么是读取超出了分配的末尾 ( int*),要么是把 an 视为int完全不相关的类型——在这种情况下,请考虑带有 vtable 的类的内存布局或数据,例如std::string向 中添加一些 s NewClass,以及读取和写入这些成员。