对象的地址-void *和void **

时间:2019-07-13 21:12:21

标签: c++ memory function-pointers void-pointers virtual-functions

我试图获取存储在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;

}

1 个答案:

答案 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

多重继承和/或虚拟继承会使这样做变得更加困难。

Live demo