dynamic_cast内部是如何工作的?

4
有人能向我解释一下dynamic_cast在内部是如何工作的吗?Virtual Pointer在其中的作用是什么?

1
@Hariprasad 但是怎么做呢?static_cast也使用指针算术运算,隐式的派生类到基类转换也是如此。 (除非涉及虚基类; 在这种情况下,我相信一些编译器会使用额外的间接级别。) - James Kanze
@James Kanze:这是一个理论家的回答。 严格来说,它确实使用指针算术,你不能否认这一点。 它还使用RAM和ALU。 因此,“从形式上讲”,该答案是正确的。 但绝对没有用 :) - valdo
同意,詹姆斯。static_cast 也使用指针算术。 - hims
2个回答

14

从正式的角度来看,这当然是由实现定义的,但在实践中,虚函数表中会有一个额外的指针,指向对象的描述,可能作为包含指向各个子类(派生类)和有关其类型的信息(例如指向type_info的指针)的对象DAG。

然后编译器会生成代码,遍历图中不同的路径,直到找到目标类型或访问完所有节点。如果它找到目标类型,节点也将包含必要的信息以便于转换指针。

编辑:

我想到了一个额外的细节。即使生成的代码找到了匹配项,它也可能需要继续导航以确保它不是模棱两可的。


同意。特别是我喜欢你的前言“当然,从正式上讲,这是实现定义的”。如果没有这个,所有的理论家都会毫不留情地对你的(正确)答案进行投票否决 :) - valdo
1
@valdo 实际上,我把它放在那里是为了(正式地)表明可以预期变化。我想不出在抽象层面上实现它的其他方法,但低级细节(特别是:代码如何知道它有匹配项)可能会有很大差异,并且导航位于只读内存中的DAG(而不是树)也需要额外的工作。 - James Kanze

0
我所了解的是:
dynamic_cast 知道: 1. 对象是多态类型,即它具有一个或多个虚成员函数。 2. 从实践中得知,对象具有 vtable 指针。
从 vtable 指针,它可以访问到最派生类的类型信息。这也是最基本的用法,写 dynamic_cast(p),其中 p 是指向完整对象的 void* 指针。这是一个特殊情况。
如果我的回答有误,请纠正我,或者如果您想改进我的回答,也非常欢迎。
谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接