假设我有类型A和派生类型B.当我执行从A *到B *的动态转换时,环境执行什么样的“运行时检查”?怎么知道演员是合法的?
我假设在.Net中可以在对象的头文件中使用附加的元数据,但在C ++中会发生什么?
答案 0 :(得分:3)
动态演员分为两个步骤:
给定指向对象的指针的vtable,使用offset来恢复指向完整类的指针。 (然后将从此指针进行所有调整。)这相当于向全班降级。
在完整类的type_info中搜索我们想要的类型 - 换句话说,查看所有碱基的列表。如果找到一个,请使用偏移量再次调整指针。如果步骤2中的搜索失败,则返回NULL。
答案 1 :(得分:3)
精确算法是编译器特定的。以下是Itanium C++ ABI(2.9.7)标准(GCC之后和之后编写)的工作原理。
指向基类的指针是指向“大”类主体中间的指针。 “big”类的主体以这样的方式组装,无论你的指针指向哪个基类,你都可以统一访问那个“大”类的RTTI,你的“基类”实际上是 。这个RTTI是一个特殊的结构,它与“大”类信息有关:它是什么类型的,它有什么基础以及它们有什么偏移。
实际上,它是该类的“元数据”,但更具“二元”风格。
V instance;
Base *v = &instance;
dynamic_cast<T>(v);
动态强制转换利用了这样一个事实:当您编写dynamic_cast<T>(v)
时,编译器可以立即识别 v 的“大”类的元数据 - 即V
!当你写它时,你认为 T
比Base
派生的更多,所以编译器很难做到基础到驱动的强制转换。但是编译器可以立即(在运行时)确定最需要的类型 - V
- 然后它只能遍历元数据中包含的继承图来检查是否可以将V
转发给T
。如果可以的话,它只是检查偏移量。如果它不能或者不流行 - 返回NULL
。
答案 2 :(得分:0)
动态强制转换执行运行时检查这是否是有效且可行的强制转换;当无法执行演员表时,它将返回NULL。
答案 3 :(得分:-2)
在RTTI上推荐你最喜欢的书。