多重继承中的c ++ vtable,指向thunk方法的指针

问题描述 投票:1回答:1

我读过这篇文章:https://shaharmike.com/cpp/vtable-part2/

我无法理解为什么在vtable(文章末尾)我们有这个指针:

0x400918 0x400820非虚拟thunk到Child :: FatherFoo()

但不是指针直接指向方法Child :: FatherFoo()?

我认为Child的vtable完全与父亲的vtable分开。

c++ multiple-inheritance vtable virtual-method vptr
1个回答
0
投票

就像C结构中除了一个成员之外的所有成员都不能具有与包含对象相同的地址时,除了一个非空基类子对象之外的所有子对象都不能具有与完整对象相同的地址。根据定义,多态基类(具有虚函数的基类)不为空。

与派生对象具有相同地址的多态基础子对象称为主要基础。派生对象共享vtable布局的基础和vptr与主基础:隐式this参数不会更改。

注意:主要基础的概念是C ++实现域概念(如vtable,vptr ...),而不是C ++语言概念(如基类,虚函数......)。因此,显然,它没有在C ++标准中描述。

当通过虚拟调用机制动态调用虚函数时,对于未知动态类型的对象,必须将this隐式参数调整为正确的值,该值是非主要基数的不同值。这样做的中间人称为thunk。在这种情况下,thunk可以对正确的函数执行跳转而不是函数调用:在函数入口处进行额外的工作,并且在函数退出时不需要任何操作。

当使用协变返回类型并且协变返回的派生到基本关系不是导出到主要基本关系时,发生另一种类型的调整。显然,这种thunk不会跳转,它会执行函数调用,因为协方差的调整发生在函数退出时。

© www.soinside.com 2019 - 2024. All rights reserved.