多个或虚拟继承下的类的内存布局和vtable?

时间:2015-02-14 22:58:27

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

我正在阅读"在C ++对象模型中",试图了解如何通过vtable实现多重和虚拟继承。(我完全理解单个多态性)。

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

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

1 个答案:

答案 0 :(得分:16)

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

当调用虚函数时,代码计算vtable中函数指针的偏移量,并调用存储在那里的地址函数。

enter image description here

当基类的派生类覆盖virtuall函数时,该类的虚拟表只指向覆盖的函数而不是原始函数。

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