【问题标题】:Memory layout of a class under multiple or virtual inheritance and the vtable(s)?多重或虚拟继承下的类的内存布局和vtable(s)?
【发布时间】:2015-04-15 18:32:22
【问题描述】:

我正在阅读“C++ 对象模型内部”,试图了解如何通过 vtables 实现多重和虚拟继承。(我非常了解单多态性)。

当需要在虚拟继承期间或强制转换期间定位方法时,我很难理解究竟做了什么,因为要执行大量的偏移计算。

是否有人能够帮助理解在多重继承或虚拟继承示例中如何使用多个 vtable?如果我能理解布局和问题,我可能会更好地理解这个问题。

【问题讨论】:

  • 当你说多重继承时,你的意思是有连续的派生(c继承自b并继承自a)还是你的意思是真正的多重继承(c同时继承自a和b)?
  • 这个问题可能对stackoverflow.com/q/11603198/1741542有帮助

标签: c++ inheritance polymorphism multiple-inheritance virtual-inheritance


【解决方案1】:

C++ 实现通常使用 vtables 来实现虚函数。 vtable 是指向函数的指针表。具有虚函数的类的每个对象都有一个指向包含该类所有虚函数地址的虚表的隐藏指针。

在调用虚函数时,代码计算函数指针在虚表中的偏移量,并调用存放地址的函数。

当基类的派生类覆盖了一个虚函数时,该类的虚表只指向被覆盖的函数而不是原来的函数。

这个excellent article explains 详细介绍了它是如何工作的,包括单继承和多继承。

【讨论】:

  • 这仅适用于单一继承。如果我们有class B: virtual public A{ 怎么办?
  • @BogdanMart 我试图回答OP的主要问题。对于 MI 的高级案例,包括虚拟继承,我诚邀您阅读我链接的文章。它提供了所有需要的详细信息。
  • 我来这里是为了寻找虚拟类继承的多重继承。是我遗漏了什么还是你在解释普通的虚函数?
  • @NirIzr 由于这个问题相当广泛,我在评论中提出了一个精炼问题,并准备了另一个问题,看看我的答案必须有多具体。 OP 没有回答我的第一个问题,所以我解释了如何计算 vtable 和偏移量(问题的第二部分)并参考了一篇文章,该文章解释了在 MI 和 VI 的情况下如何找到正确的 vtable。两者一起涵盖了所有问题。如果您对 VI 特别感兴趣,答案中链接的文章可能会有所帮助。
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 2020-09-30
  • 2015-09-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多