c++ - 多重或虚拟继承下的类的内存布局和vtable(s)?

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

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

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

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

最佳答案

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

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

enter image description here

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

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

关于c++ - 多重或虚拟继承下的类的内存布局和vtable(s)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28521242/

相关文章:

C++ - 通过初始化列表构造 unique_ptr 的 vector

c++ - 两个类可以使用 C++ 互相看到吗?

iOS:覆盖子类中父类(super class)的setter属性

c++ - 判断字段是否为NULL

c++:通过多级继承从模板子类调用基类的模板方法

C++ 结合静态和动态多态性来创建 "Hyper Polymorphism"?

c++ - 如果基类不应该是抽象的,处理复制多态对象的虚拟方法的最佳方法是什么?

c# - 根据类型切换行为的最佳方式

android - ndk-build 输出 ‘error adding symbols. File in wrong format’

android - 在 Android/OpenSL 中,我可以释放单个缓冲区并将其排入 bufferQueue 中,而不是清除整个缓冲区吗?