gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:04:14 27 4
gpt4 key购买 nike

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

我不明白为什么在 vtable 中(在文章末尾)我们有这个指针:

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

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

我假设 Child 的 vtable 与 Father 的 vtable 是完全分开的。

最佳答案

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

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

注意:primary base的概念是一个C++实现域概念(如vtable、vptr...),而不是C++语言概念(如基类、虚函数...)。所以,很明显,C++ 标准中没有描述它。

当一个虚函数被动态调用时,通过虚调用机制,在一个未知动态类型的对象上,this隐式参数必须被调整为正确的值,这是一个不同的值的非主要碱基。执行此操作的中介称为 thunk。在这种情况下,thunk 可以跳转到正确的函数而不是函数调用:额外的工作发生在函数入口处,而在函数导出处不需要任何操作。

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

关于多重继承中的c++ vtable,指向thunk方法的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48997211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com