【问题标题】:How does virtual inheritance work? [closed]虚拟继承如何工作? [关闭]
【发布时间】:2012-08-31 22:54:45
【问题描述】:
  1. 虚拟继承是否使用vTable?如果是或否,那么它是如何实现的
  2. 虚拟继承在内存中的行为如何?
  3. 虚拟继承的任何其他替代方法

非常感谢概念性的解释。

【问题讨论】:

  • 它依赖于实现,严格的技术术语是未指定,C++标准只描述了虚拟继承必须提供的行为,但没有指定它应该如何已实现。它作为实现的细节被忽略了,他们不需要指定这个细节。话虽如此,大多数(阅读所有已知)编译器确实使用虚拟表和指针机制。
  • 说了上面的话,不要认为Q是无关紧要的或者根本不是真正的Q。所有编译器都使用类似的机制,虽然不需要知道实现细节,但它不会知道它不会有什么坏处。此外,这个 Q 被问了很多次,如果有人花时间并令人信服地回答它,它会成为一个很好的 C++ 常见问题解答。

标签: c++ memory inheritance virtual


【解决方案1】:

虚拟继承的实现方式因编译器而异。

1) 是的,vc 和 gcc 都使用 vTable 指针。但是 vc 有另一个指针 ref 作为虚拟基指针。

2) 对于经典的虚拟继承,例如 Left

Left.vptr  // -> to its vtable

Left::element_in_left

Right.vptr

Right::element_in_right

Bottom::element_in_bottom

Top::element_in_top

程序使用vptr来查找vtable,对于gcc来说,viable中有一个virtual base offset值。 vptr + base offset 将给出父地址。

3) 我不确定你的意思。在 C++ 编译器中有不同的方法来实现它。其他语言也有自己的绑定函数的方法。

【讨论】:

  • 非常感谢!看起来很复杂!你能推荐我一些简单的文章或书籍来阅读吗?
  • @NayanaAdassuriya 我已经在我的母语帖子中阅读过这些知识,所以我对英文书籍并不熟悉。我想你可以在 google 中搜索“C++ 内存布局虚拟继承”,那里有很多很棒的帖子。
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2016-10-26
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多