【问题标题】:Does virtual inheritance and virtual function use the same vtable?虚继承和虚函数使用同一个vtable吗?
【发布时间】:2011-06-26 02:27:49
【问题描述】:

有一个little related question。但主题完全不同。

现在,一个概念是关于函数解析,另一个是关于class 解析?我想知道如果他们使用相同的 vtable (at least in gcc-4.5) 怎么可能?这是依赖于编译器的术语吗?

我知道这可能看起来像一个基本的愚蠢问题,但我从未想过。

【问题讨论】:

  • 它显然是依赖于编译器的,因为 C++ 规范中没有任何东西要求使用 vtable。
  • 一个实现当然可以为这两个目的使用单个 vtable。为什么你认为这是不可能的?仅使用一个 vtable 会难以执行哪些具体操作?
  • 我并不是说这是不可能的,只是想简要了解一下它是如何在幕后发生的。
  • @n.m:我当然可以理解为什么 OP 在考虑不可能。我记得,Bjarne 提到(可能是在设计和进化方面)他必须煞费苦心地解决细节以说服自己这是可能的。也就是说,一些编译器在某些极端情况下错误地实现了虚拟继承,这并非微不足道。
  • 我想你可能对this paper 感兴趣,它是关于虚拟表(table)的,包括虚拟继承及其含义。 :)

标签: c++ vtable virtual-inheritance virtual-functions


【解决方案1】:

Itanium ABI 是这类事情的一个很好的参考 - 参见例如http://mentorembedded.github.com/cxx-abi/abi.html#vtable。尽管名称如此,但它是 C++ 中广泛使用的 ABI,它描述了一个良好的、有效的实现(尽管显然其他实现也是可能的)。

【讨论】:

    【解决方案2】:

    如果您知道一个对象的动态类型,只需一个指向它的指针,就可以解决这两个问题(虚拟函数调用和虚拟继承)。 C++ 中的每个(多态)对象都恰好有一个动态类型,它在构造它的那一刻就确定了。例如。当您编写new Foo 时,即使您只存储void*,该对象也具有动态类型Foo

    vtable 是一种存储对象动态类型信息的机制,可以通过基指针检索。您可以在 vtable 中存储很多东西:函数指针、转换偏移量、std::type_info 对象甚至。

    【讨论】:

      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 2015-08-23
      • 2012-08-06
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多