我试图获取存储在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;
}
答案 0 :(得分:0)
这都是未定义的行为,但是以下代码将为您提供该vtable地址:
A obj;
void **vtable = * (void ***) &obj;
对vtable的布局进行一些假设,我们可以证明是这样的:
#include <iostream>
class A
{
public:
virtual void f () { }
};
int main() {
A obj;
void **vtable = * (void ***) &obj;
std :: cout << vtable << std :: endl;
std :: cout << *vtable << std :: endl;
std :: cout << (void *) &A::f << std :: endl;
}
输出:
0x400e88
0x400de4
0x400de4
多重继承和/或虚拟继承会使这样做变得更加困难。