14

可能重复:
关于 C++ 中虚拟机制的问题

使用 vtable 是在 C++ 中实现虚拟成员函数机制的唯一方法吗?还有哪些其他方式?

4

4 回答 4

11

从技术上讲,动态调度所需要的只是识别对象的动态类型的能力,给定一个指向它的指针。因此,任何类型的隐藏(或不那么隐藏)的typeid字段都可以使用。

动态调度将使用该 typeid 来查找关联的函数。该关联可以是一个 hastable 或一个 typeid 为索引的数组,或任何其他合适的关系。vptr 恰好是以最少的步骤实现这一目标的方法。

于 2011-03-24T10:55:56.193 回答
3

另一种可能的实现是将指向虚函数的指针直接存储到对象中。当然,这个解决方案从未在实践中使用过(至少在我所知道的任何语言中),因为它会导致内存占用量的急剧增加。但是,有趣的是,使用此实现的代码实际上可以运行得更快,因为它通过抑制对 vptr 的需求来删除间接层。

于 2011-03-24T16:25:52.570 回答
3

另一种已知的机制是类型分派函数。实际上,您将 vtable 指针替换为 typeid(小枚举)。(动态)链接器收集给定虚函数的所有覆盖,并将它们包装在 typeid 字段上的一个大 switch 语句中。

The theoretical justifcation is that this replaces an indirect jump (non-predicatble) by lots of predicatable jumps. With some smarts in choosing enum values, the switch statement can be fairly effective too (i.e. better than lineair)

于 2011-03-25T10:45:36.987 回答
2

我不知道有任何编译器在不使用 vtable 方法的情况下实现虚函数。

然而,理论上,可以创建对象指针的内部映射和指向虚函数的指针表,例如map<objPtr, functionTable*>,通过虚函数实现动态多态性。但它会使动态调度比 vtable-approach 慢。

似乎 vtable-approach 可能是实现动态多态性的最快机制。也许,这就是所有编译器都采用这种方法的原因!

于 2011-03-24T10:44:52.220 回答