码
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++规范对此案例的评价是什么?
dynamic_cast<T>(v)可以归结为最派生的对象v是子对象,然后向上(可能是不同的分支)以找到明确的基类,其T是指针或引用.从标准:
5.2.7/8如果
C是T指向或引用的类类型,则运行时检查在逻辑上执行如下:
- 如果,在指向(引用)的最多派生对象中
v,v指向(引用)对象的公共基类子C对象,并且如果只有一个对象类型C是从v结果点指向(引用)的子对象派生的(指的是那个C对象.- 否则,如果
v点(引用)到最派生对象的公共基类子对象,并且最派生对象的类型具有类型的基类C,即明确且公共的,则结果指向(引用)C子对象最派生的对象.- 否则,运行时检查失败.
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |