代码之家  ›  专栏  ›  技术社区  ›  mike bayko

C++reinterpret_cast是否总是返回结果?

  •  4
  • mike bayko  · 技术社区  · 7 年前

    我有两个类,A和B。A是B的父类,我有一个函数,接收指向A类型类的指针,检查它是否也是B类型的,如果是,将调用另一个函数,接收指向B类型类的指针。 当函数调用另一个函数时,我提供reinterpret_cast(a)作为参数。如果这看起来不明确,下面是一个代码示例:

    void abc(A * a) {
      if (a->IsA("B")) { //please dont worry much about this line,
                         //my real concern is the reinterpret_cast
        def(reinterpret_cast<B *>(a));
      };
    };
    

    现在你们知道我是如何调用“def”的了,我想知道reinterpret\u cast是否真的返回了一个类型为B的指针,作为def的参数发送出去。

    5 回复  |  直到 7 年前
        1
  •  5
  •   pm100    7 年前

    reinterpret_cast总是按你说的做-这是一个雪橇运动员。你能做到的

    def(reinterpret_cast<B *>(42));
    

    std::string hw = "hello";
    def(reinterpret_cast<B *>(hw));
    

    它将始终返回可能指向正确类型的指针。它假设你知道自己在做什么

        2
  •  3
  •   Remy Lebeau    7 年前

    B* 但是 reinterpret_cast

    如果你确定类型是 B 使用 static_cast dynamic_cast 并测试指针(如果 动态_投射 nullptr )

    看见 https://stackoverflow.com/a/332086/5303336

        3
  •  2
  •   mksteve    7 年前

    reinterpret_cast

     union { 
         TypeA anA;
         TypeB aB;
     } a;
    

     reinterpret_cast< B* >( a );
    

    假设is指针指向成员anA,然后可以传递aB地址。

    如果类型是同一类层次结构的一部分,则static_cast<&燃气轮机;将允许您在编译时发现是否有足够的信息来执行强制转换。通常情况下 B A (单个或乘法)。

    如果没有足够的信息使静态_cast工作,那么可能会得到动态_cast<&燃气轮机;工作。这种情况下 类型以某种方式派生自 .

    dynamic_cast<B*>( a ) static_cast< B*>( a ) 当他们成功时可能不会产生相同的地址。

    这是因为当多重继承时,二次继承会在对象中创建多个类和vtable。当这种情况发生时,static\u cast和dynamic\u cast会调整对象的基址,以找到正确的嵌入式类基址。

        4
  •  1
  •   PaulR    7 年前

    重新解释强制转换将始终返回指针。它可能只是不是一个有效的指针,因为它实际上指向B类型的对象。

    对于您的用例,您应该使用静态强制转换,其优点是编译器将检查B是否实际派生自a,并执行任何必要的调整。额外检查不会产生运行时开销,但是,如果对象实际上不是B类型,并且程序将任意失败,则不会发出警告。

        5
  •  1
  •   Remy Lebeau    7 年前

    正如其他人所说, reinterpret_cast dynamic_cast

    void abc(A * a) {
        B *b = dynamic_cast<B*>(a);
        if (b) {
            def(b);
        }
    }