C++ C++;:帮助理解这行代码

C++ C++;:帮助理解这行代码,c++,visual-studio,vtable,vptr,C++,Visual Studio,Vtable,Vptr,我正在寻找一种通过指针直接访问vtable的方法,并遇到了以下帖子: 它工作正常,我可以通过vtable条目调用函数。 但我很难理解deo的这一行: void (**vt)() = *(void (***)())ptr; ptr是指向对象的指针。我如何破译这一行,以及如何获得vtable地址 谢谢。表在对象中的实际位置取决于编译器。代码假定表地址首先存储在对象中(所有现代编译器似乎都是这样做的)。此外,每个类只有一个vtable,它存储在单个位置。因此,每个实例都有一个指向函数指针数组的地址

我正在寻找一种通过指针直接访问vtable的方法,并遇到了以下帖子:

它工作正常,我可以通过vtable条目调用函数。 但我很难理解deo的这一行:

void (**vt)() = *(void (***)())ptr;
ptr
是指向对象的指针。我如何破译这一行,以及如何获得vtable地址


谢谢。

表在对象中的实际位置取决于编译器。代码假定表地址首先存储在对象中(所有现代编译器似乎都是这样做的)。此外,每个类只有一个vtable,它存储在单个位置。因此,每个实例都有一个指向函数指针数组的地址

基本上,创建一个名为vt的变量,它是指向返回void且不带参数的函数的指针数组。然后使用在对象的第一个成员(vtable的地址)中找到的内容初始化该变量

这意味着您将第一个4(32位机器)或8(64位机器)转换为指向函数指针数组的指针,该函数指针返回void且不带参数

*(void (***)())ptr

返回这4或8个字节的内容,即vtable的地址。

对象中vtable的实际位置取决于编译器。代码假定表地址首先存储在对象中(所有现代编译器似乎都是这样做的)。此外,每个类只有一个vtable,它存储在单个位置。因此,每个实例都有一个指向函数指针数组的地址

基本上,创建一个名为vt的变量,它是指向返回void且不带参数的函数的指针数组。然后使用在对象的第一个成员(vtable的地址)中找到的内容初始化该变量

这意味着您将第一个4(32位机器)或8(64位机器)转换为指向函数指针数组的指针,该函数指针返回void且不带参数

*(void (***)())ptr

返回这4或8个字节的内容,即vtable的地址。

对象中vtable的实际位置取决于编译器。代码假定表地址首先存储在对象中(所有现代编译器似乎都是这样做的)。此外,每个类只有一个vtable,它存储在单个位置。因此,每个实例都有一个指向函数指针数组的地址

基本上,创建一个名为vt的变量,它是指向返回void且不带参数的函数的指针数组。然后使用在对象的第一个成员(vtable的地址)中找到的内容初始化该变量

这意味着您将第一个4(32位机器)或8(64位机器)转换为指向函数指针数组的指针,该函数指针返回void且不带参数

*(void (***)())ptr

返回这4或8个字节的内容,即vtable的地址。

对象中vtable的实际位置取决于编译器。代码假定表地址首先存储在对象中(所有现代编译器似乎都是这样做的)。此外,每个类只有一个vtable,它存储在单个位置。因此,每个实例都有一个指向函数指针数组的地址

基本上,创建一个名为vt的变量,它是指向返回void且不带参数的函数的指针数组。然后使用在对象的第一个成员(vtable的地址)中找到的内容初始化该变量

这意味着您将第一个4(32位机器)或8(64位机器)转换为指向函数指针数组的指针,该函数指针返回void且不带参数

*(void (***)())ptr
返回这4或8个字节的内容,即vtable的地址。

void(**vt)(

vt是指向某个函数的指针。此函数返回void,不接受任何参数。
void(***)(

指指向此类函数的指针(即,一个以上的指针级别)

首先,您将ptr转换为这样一个指向函数的三级指针。
然后,你得到它所指向的东西(用一个
*
),这是一个指向函数的两级指针,也就是说,变量vt的类型相同。这意味着你可以将它分配给vt,这就是这一行的作用

为什么

指向void no param函数的单个函数指针可以存储在这样的变量x:
void(*x)(
)中。不完全相关,如果你想把数组传递给函数,你就要传递一个指针。即,将数组地址存储在指针中就足够访问整个数组(如果长度已知)。
这意味着
void(**vt)(
可以存储函数指针数组的地址。
vtable不是别的,只是一个函数指针数组

如果你有一个类Car,它有一些变量,比如颜色和vtable,它使用每个对象200字节。指向汽车的指针就像指向200字节数组的指针,如果您访问代码中的颜色,编译器将查找该颜色,例如字节133,并生成对该颜色的访问

vtable在此对象中的位置由实现定义,但通常在开始时定义。如果你有一个指向汽车的指针,它是一个指向200字节数组的指针,首先分为一些功能指针,然后是一些其他数据

=>vtable,即函数指针数组,从汽车的起始地址开始。
=>如果您将汽车指针转换为指向vtable的指针,即指向“函数指针数组”的指针,即指向“函数指针数组”的指针,并依此类推,则您拥有vtable数组

void(**vt)(

vt是指向某个函数的指针。此函数返回void,不接受任何参数。
void(***)(

指指向该函数的指针(i