dynamic_cast <>是否仅限于继承层次结构中的直接强制转换?

kfm*_*e04 3 c++ casting c++11

struct A { };           // virtual details there, but left out
struct B { };           // virtual details there, but left out
struct C : A, B { };    // virtual details there, but left out

C c;
B& b = c;
A& a = dynamic_cast<A&>( b );  // will this cast succeed at run-time?
Run Code Online (Sandbox Code Playgroud)

请注意,我遗漏了虚拟细节以保持代码简单.

如果dynamic_cast <>仅限于继承层次结构中的直接强制转换,那么我希望上面的代码在运行时失败(因为B&与A&无关).

但是,如果它更通用/灵活,则代码应该起作用,因为引用对象的真实类型是C类型(并且C可以称为B&或A&).

C++规范对此案例的评价是什么?

Igo*_*nik 6

dynamic_cast<T>(v)可以归结为最派生的对象v是子对象,然后向上(可能是不同的分支)以找到明确的基类,其T是指针或引用.从标准:

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

  • 如果,在指向(引用)的最多派生对象中v,v指向(引用)对象的公共基类子C对象,并且如果只有一个对象类型C是从v结果点指向(引用)的子对象派生的(指的是那个C对象.
  • 否则,如果v点(引用)到最派生对象的公共基类子对象,并且最派生对象的类型具有类型的基类C,即明确且公共的,则结果指向(引用)C子对象最派生的对象.
  • 否则,运行时检查失败.