dynamic_cast<>是否仅限于沿继承层次结构的直接强制转换?
Is a dynamic_cast<> limited to direct casts along the inheritance hierarchy?
>CODE
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?
请注意,为了保持代码简单,我省略了虚拟细节。
如果dynamic_cast<>仅限于沿继承层次结构的直接强制转换,那么我希望上面的代码在运行时失败(因为 B& 与 A&无关)。
但是,如果它更通用/灵活,代码应该可以工作,因为引用对象的 true 类型是 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
子对象 对象。- 否则,运行时检查将失败。
现在,代码无法编译,因为没有一个类有任何虚函数 - 这是使用dynamic_cast
的要求。如果你添加至少一个虚函数(例如,一个虚拟dtor到B
,那么是的,因为一个C
是从B
公开派生的,所以强制转换会成功。
下面是一些快速演示代码:
#include <iostream>
struct A {
virtual void junk() { std::cout << "A"; }
void trash() { std::cout << "A"; }
virtual ~A() {}
};
struct B {
virtual ~B(){}
void trash() { std::cout << "B"; }
void junk() { std::cout << "B"; }
};
struct C : virtual A, virtual B {
void trash() { std::cout << "C"; }
void junk() { std::cout << "C"; }
};
int main() {
C c;
B& b = c;
A& a = dynamic_cast<A&>(b);
a.trash();
std::cout << "n";
a.junk();
}
输出(使用 VC++ 和 g++,这不是最前沿的,所以我希望除了真正古老的编译器之外的任何东西都能正确)是:
A
C
显示a
具有静态类型的A
,但动态类型为C
。
相关文章:
- 继承层次结构并将元素添加到向量
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 在C++继承层次结构时提取实现者
- 在继承层次结构中复制和移动
- 多重继承:跳过'virtual'关键字并拒绝菱形层次结构的使用?
- 当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法
- Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外
- 检查类是否在继承层次结构中显式定义了成员类型
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 有关继承层次结构的问题,没有任何虚拟功能
- 沿类层次结构的私人继承,为什么在整个层次结构中都需要朋友
- 在 c++ 中,通常比较继承层次结构中的对象
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- 避免C++中继承层次结构中的重复代码
- dynamic_cast<>是否仅限于沿继承层次结构的直接强制转换?
- 如何为类的继承层次结构的获取者创建统一的接口
- 继承层次结构中级中的新虚函数
- 通过并行继承层次结构中的父级关联子项
- OO 正确性 - 继承层次结构 - 谁创建其他对象使用的对象
- 最佳继承层次结构,例如:Model3D -> ModelAnimation VS ModelAnimation or Model3D -> ModelAnimation