gpt4 book ai didi

c++ - void (**vt)() = *(void (***)())ptr; c++中虚拟表的辅助变量

转载 作者:可可西里 更新时间:2023-11-01 17:38:10 32 4
gpt4 key购买 nike

我在以下链接中找到了这项技术: http://www.codeproject.com/Tips/90875/Displaying-vtable-when-debugging

在那里,他使用了一个辅助变量

void (**vt)() = *(void (***)())ptr;

帮助显示虚函数表。

但是如果我把它改成

void (**vt)() = (void (**)())ptr;

它不像以前那样工作。

有人能帮我解释一下这里的魔法吗?

最佳答案

为了清楚起见,让我们引入一个 typedef。

typedef void (**thing)();

那么第一个代码是

thing vt = *(thing*) ptr;

第二个

thing vt = (thing) ptr;

也就是说,第一个说“把 ptr 当作指向一个东西的指针,然后给我它指向的东西”,第二个说“把 ptr 当作一个东西”。
区别应该很明显。

它能完全工作的原因是针对 Visual C++ 编译器和 Visual Studio 调试器的。

如果调试器不知道对象的真正类型,它会显示它所知道的,即它是基类的实例,它只知道基类的 vtable 有多少条目。

(您在这里遗漏了一个关键部分,即向监 window 口中的项目添加预期数量的表条目。这使调试器将该内存显示为一个包含您所说的尽可能多的元素的数组。)

所以技巧包括为 vtable 发明一个名称,并告诉调试器要从表中显示多少元素。

关于c++ - void (**vt)() = *(void (***)())ptr; c++中虚拟表的辅助变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18246016/

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