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

Nar*_*rek 4 c++ polymorphism pointers dynamic-cast

看到这里:

dynamic_cast只能用于指针和对类的引用(或使用void*).其目的是确保类型转换的结果指向目标指针类型的有效完整对象.

这自然包括指针upcast(从指针到派生到指针到base的转换),与隐式转换允许的方式相同.

但是,如果指向对象是目标类型的有效完整对象,则dynamic_cast也可以向下转换(从指针到基础转换为指向派生的)多态类(具有虚拟成员的类).

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

Pet*_*ker 6

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

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

Base* bp = get_base();
Derived* dp = dynamic_cast<Derived*>(bp);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • "*没有充分的理由禁止它*"我有一个:因为`static_cast`已经涵盖了它.这意味着`dynamic_cast`只能*用于多态的从基数到转换的转换.这样,如果您在代码库中看到`dynamic_cast`,就会知道某人正在尝试做什么. (3认同)