首页 文章

为什么dynamic_cast可以用于非多态类型的upcast?

提问于
浏览
3

here

dynamic_cast只能用于指针和对类的引用(或使用void *) . 其目的是确保类型转换的结果指向目标指针类型的有效完整对象 . 这自然包括指针upcast(从指针到派生到指针到base的转换),与隐式转换允许的方式相同 . 但是,如果指向对象是目标类型的有效完整对象,则dynamic_cast也可以向下转换(从指针到基础转换为指向派生的)多态类(具有虚拟成员的类) .

为什么dynamic_cast可以用于非多态类型的upcast,但对于非多态类型再次向下转换是不行的?

1 回答

  • 5

    将指向派生类型的指针转换为指向基类型的指针可以在不知道被指向的对象的确切类型的情况下完成,因为派生类型始终是基类型的实例 . 也就是说,转换仅取决于 static 信息 . 所以 dynamic_cast 在那个方向总是好的,因为它总能完成 .

    使用 dynamic_cast 转换另一种方式需要知道所指向对象的实际类型,因为没有该信息就无法知道转换是否有效 . 例如:

    Base* bp = get_base();
    Derived* dp = dynamic_cast<Derived*>(bp);
    

    在这种情况下,如果 bp 实际上指向 Base 类型的对象,则转换无效;如果它指向 Derived 类型的对象或从 Derived 派生的类型,则转换是可以的 .

    要在运行时确定对象的确切类型,支持代码依赖于仅需要为多态类型提供的嵌入式类型信息 . 这就是为什么基于派生的转换需要多态类型:它确保存在所需的信息 .

    当然,该标准可能使派生到基础的转换对非多态类型无效,但这是一个procrustean限制;没有充分理由禁止它 .

相关问题