c ++中的复杂dynamic_cast

gal*_*tte 10 c++ polymorphism dynamic-cast language-lawyer cross-cast

我在C++中有以下情况:

  • 抽象基类Abstract1Abstract2.他们是无关的.
  • 一类Foo来自推导Abstract1Abstract2

我在一个编译单元,我没有关于类的信息Foo(没有声明,没有定义).只有Abstract1而且Abstract2众所周知.(实际上,Foo甚至在DLL中定义)

将dynamic_cast的允许从铸造Abstract1*Abstract2*?这是标准吗?

Col*_*mbo 6

你所描述的是所谓的交叉演员.对于dynamic_cast<T>(v),标准在[expr.dynamic.cast]/8中指定

如果CT指向或引用的类类型,则运行时检查在逻辑上执行如下:

  • 如果,在指向(引用)的最派生对象中v,v指向(引用)对象的公共基类子C对象[...]

  • 否则,如果vpoint(引用)到public最派生对象的基类子对象,并且最派生对象的类型具有类型的基类C,那是明确的public,并且结果指向(引用)该C子对象的子对象.大多数派生对象.

即使Foo在包含演员表的翻译单元中没有关于其存在的信息,这也将起作用.

你也应该看看这个问题.