C++ 检查X是否通过typeid从Y派生

C++ 检查X是否通过typeid从Y派生,c++,casting,typeid,C++,Casting,Typeid,我需要将指针转换为long(SendMessage()) 我想安全地检查另一边的变量是否正确。所以我想做动态演播,但在非虚拟的课堂上是行不通的。然后我考虑使用typeid,但在我传递一个派生的var作为它的基础之前,它是有效的 有没有办法检查指针是否是我在运行时所期望的? 有没有一种方法可以使用typeid查看指针是否是从特定基派生的类型?PTLib()使用PCLASSINFO宏定义类之间的关系。这提供了IsDescendant和GetClass等函数 您可能可以实现类似的功能。PTLib()使

我需要将指针转换为long(SendMessage()) 我想安全地检查另一边的变量是否正确。所以我想做动态演播,但在非虚拟的课堂上是行不通的。然后我考虑使用typeid,但在我传递一个派生的var作为它的基础之前,它是有效的

有没有办法检查指针是否是我在运行时所期望的? 有没有一种方法可以使用typeid查看指针是否是从特定基派生的类型?

PTLib()使用PCLASSINFO宏定义类之间的关系。这提供了IsDescendant和GetClass等函数

您可能可以实现类似的功能。

PTLib()使用PCLASSINFO宏定义类之间的关系。这提供了IsDescendant和GetClass等函数


您可能可以实现类似的功能。

dynamic\u cast通过检查虚拟方法表的签名来工作。如果您没有虚拟方法,那么就没有VMT,所以正如您所说的,dynamic_cast将无法工作。但是,如果您没有VMT,则绝对不知道所指向的对象


最好的办法是要求指针指向至少有一个虚方法的类,即使它是一个伪方法。然后动态强制转换将工作。

动态强制转换通过检查虚拟方法表的签名来工作。如果您没有虚拟方法,那么就没有VMT,所以正如您所说的,dynamic_cast将无法工作。但是,如果您没有VMT,则绝对不知道所指向的对象


最好的办法是要求指针指向至少有一个虚方法的类,即使它是一个伪方法。那么动态演员阵容就可以了。

我还不明白你的问题是关于什么的

  • 如果是您是否可以确定对长边和背面进行铸造将产生相同的值,请查看
    根据其他回答者链接到的MS站点的“使用指针的规则”,正确的类型是
    UINT\u PTR
    。所以你做了
    UINT\u PTR v=reinterpret\u cast(PTR)
    转换为整数类型,然后执行相反的操作将其再次转换回指针。C++标准保证还原原始值。(关于我的解释,请参见我上面给出的链接)。顺便说一句,微软的网站还说,WPARAM和LPARAM根据平台的不同而改变大小。因此,您可以使用该变量
    v
    SendMessage
    it
  • 如果您可以在另一侧检查指针(转换为某种指针类型)是否指向某个对象,那么答案是您不能。由于您显然不确定发送它所使用的指针类型,因此无法在接收方检查指针指向的动态类型。如果您知道指针在发送方的类型,那么首先就不需要进行检查

    • 我还不明白你的问题是关于什么的

      • 如果是您是否可以确定对长边和背面进行铸造将产生相同的值,请查看
        根据其他回答者链接到的MS站点的“使用指针的规则”,正确的类型是
        UINT\u PTR
        。所以你做了
        UINT\u PTR v=reinterpret\u cast(PTR)
        转换为整数类型,然后执行相反的操作将其再次转换回指针。C++标准保证还原原始值。(关于我的解释,请参见我上面给出的链接)。顺便说一句,微软的网站还说,WPARAM和LPARAM根据平台的不同而改变大小。因此,您可以使用该变量
        v
        SendMessage
        it
      • 如果您可以在另一侧检查指针(转换为某种指针类型)是否指向某个对象,那么答案是您不能。由于您显然不确定发送它所使用的指针类型,因此无法在接收方检查指针指向的动态类型。如果您知道指针在发送方的类型,那么首先就不需要进行检查

      如果你只有一个
      ,那么你就无能为力了。没有确定任意数字是否表示有效内存地址的通用方法。即使您知道它是一个有效的内存地址,也无法确定指针指向的对象的类型。如果在地址转换为
      long
      之前,您无法确定该对象的真实类型,那么您无法确定将
      long
      转换为您计划转换的任何类型是否安全


      您只需相信邮件的发件人已向您发送了有效值。你能做的最好的事情就是采取一些预防措施,当你自己的程序收到一个虚假的值时,减少它的后果。

      如果你只有一个
      长的
      ,那么你就无能为力了。没有确定任意数字是否表示有效内存地址的通用方法。即使您知道它是一个有效的内存地址,也无法确定指针指向的对象的类型。如果在地址转换为
      long
      之前,您无法确定该对象的真实类型,那么您无法确定将
      long
      转换为您计划转换的任何类型是否安全


      您只需相信邮件的发件人已向您发送了有效值。您所能做的最好是采取一些预防措施,以减少您自己的程序在接收到虚假值时的后果。

      您不能使用typeid。如果您获取的是垃圾而不是有效指针,则会导致访问冲突,因此您的检查毫无意义

      您应该做的是将SendMessage和处理消息的代码包装到一个类型安全的界面中。这样您将无法通过une考试