代码之家  ›  专栏  ›  技术社区  ›  dimba

从“void*”中动态转换

  •  35
  • dimba  · 技术社区  · 14 年前

    this , void* 没有RTTI信息,因此从 空的*

    如果我没记错, dynamic_cast 正在研究海合会。

    你能澄清一下这个问题吗。

    5 回复  |  直到 8 年前
        1
  •  42
  •   Student    11 年前

    dynamic_cast 仅适用于多态类型,即包含虚拟函数的类。

    在gcc中,您可以 动态铸造 void* 但不是 :

    struct S
    {
        virtual ~S() {}
    };
    
    int main()
    {
        S* p = new S();
        void* v = dynamic_cast<void*>(p);
        S* p1 = dynamic_cast<S*>(v); // gives an error
    }
    
        2
  •  16
  •   Tony Delroy    9 年前

    5.2.7 - Dynamic cast [expr.dynamic.cast] 上面说是为了 dynamic_cast<T>(v) :

    • 如果 T 是指针类型, v
    • 如果 T型

    ...

    • 否则,

    所以,不,a (void*) 价值

    让我们想想您的请求可能意味着什么:假设您有一个指针,它实际上指向 Derived1* ,但是密码 dynamic_cast void* . 假设你想把它 Derived2* ,其中两个派生类都有公共基。表面上,你可能认为所有的指针都指向同一个 Base 对象,它将包含指向相关虚拟分派表和RTTI的指针,以便所有内容都可以挂在一起。但是,考虑到派生类可能有多个基类,因此 类子对象可能不是 Derived* -仅作为 空的*

    Derived1* -----> [AnotherBase]
                     [[VDT]Base]    <-- but, need a pointer to start of
                     [extra members]    this sub-object for dynamic_cast
    

    (一些答案谈到了将要从中转换的指针必须是多态类型,具有虚拟函数。这都是正确的,但有点误导。正如你在上面看到的,即使 空的* 空的* 可能是指向派生对象的开始,而您需要一个指向基类子对象的指针,从中派生类型转换。)

        3
  •  4
  •   Motti    14 年前

    void* 不可能是 dynamically_cast 艾德从。

    使用g++4.5和以下代码

    struct A {
        virtual ~A();
    };
    
    int main() {
        A a;
        void *p = &a;
        A* pa = dynamic_cast<A*>(p);
    }
    

    我得到以下错误:

    无法将“p”(类型为“void*”)动态转换为“struct A*”(源不是指向类的指针)

        4
  •  1
  •   Rook    6 年前

    我猜你会把 dynamic_cast void* . 这是合法的,并获得指向最派生类对象的指针。

    动态铸造 空的* 是非法的-从中转换的类型必须是多态的-至少包含一个虚拟函数(虚拟析构函数也计数)。

        5
  •  0
  •   usta    14 年前

    您可以将指向多态类型的指针强制转换为 void * ,但反之亦然。