有人能向我解释一下
dynamic_cast
在内部是如何工作的吗?Virtual Pointer在其中的作用是什么?dynamic_cast
在内部是如何工作的吗?Virtual Pointer在其中的作用是什么?从正式的角度来看,这当然是由实现定义的,但在实践中,虚函数表中会有一个额外的指针,指向对象的描述,可能作为包含指向各个子类(派生类)和有关其类型的信息(例如指向type_info
的指针)的对象DAG。
然后编译器会生成代码,遍历图中不同的路径,直到找到目标类型或访问完所有节点。如果它找到目标类型,节点也将包含必要的信息以便于转换指针。
编辑:
我想到了一个额外的细节。即使生成的代码找到了匹配项,它也可能需要继续导航以确保它不是模棱两可的。
static_cast
也使用指针算术运算,隐式的派生类到基类转换也是如此。 (除非涉及虚基类; 在这种情况下,我相信一些编译器会使用额外的间接级别。) - James Kanze