【发布时间】:2019-11-23 03:51:31
【问题描述】:
我试图获取存储在 y 中的 vtable 地址,但我不明白为什么 x 包含不同的地址。
#include <iostream>
class A {
public:
virtual int f() {
return 2;
}
};
int main() {
A obj;
void* x = (void**)&obj;
void* y = *((void**)&obj);
std :: cout << x << std :: endl;
std :: cout << y << std :: endl;
void** vtable = (void**)y;
std :: cout << ((int(*)())(vtable[0]))() << std :: endl;
}
【问题讨论】:
-
首先:这太疯狂了,尤其是函数调用。 mo 保证存在与成员函数(虚函数或其他函数)兼容的 任何 函数指针类型。
-
x是obj的地址——(void**)无关紧要。y是一个“正确的”类型双关语(并且是未定义的行为)。 -
为什么你认为
(void**)&obj和*((void**)&obj)会是同一个地址?也许我完全误解了。 -
我不明白为什么在那个双关语之后我在 Y 中有一个 vtable 地址。
-
这里有很多 UB。
标签: c++ memory function-pointers void-pointers virtual-functions