获取虚拟表指针c ++

Koa*_*orm 1 c++ pointers

我有一个班级如

class Stuff
{
private:
int x;
virtual int buisness()
{
  return 42;
}
public:
 Stuff(){
  x = 5;
}
Run Code Online (Sandbox Code Playgroud)

给出指向此类实例的指针

Stuff stuff;
void* thing = &stuff;
Run Code Online (Sandbox Code Playgroud)

如何使用指针"thing"获取指向变量x的指针和指向该类的虚函数表的指针?

编辑:澄清这是一个发送给我的挑战,我已经确信这不是一个技巧问题.

πάν*_*ῥεῖ 8

如何使用指针"thing"获取指向变量x的指针和指向该类的虚函数表的指针?

你不能没有thing回到原来的类型:

Stuff* stuff2 = reinterpret_cast<Stuff*>(thing);
Run Code Online (Sandbox Code Playgroud)

并且至少不会将您从该类的隐私政策中赎回,以及如何公开访问类成员指针.

实际布局是实现定义的,并且尝试使用事物和大小假设的偏移超出了标准的c ++机制.


听起来您想要绕过private具有这些成员的已知布局的类的成员访问策略.这是一个非常脏的黑客:
Disclamer:不要在生产代码中这样做!

#include <iostream>

class Stuff {
private:
    int x;
    virtual int business() {
        std::cout << "Have that 42 ... " << std::endl;
        return 42;
    }
public:
    Stuff() {
      x = 5;
    }
};

struct StuffProxy {
    // Make the layout public:
    int x;
    virtual int business();
};

int main() {
    Stuff stuff;
    void* thing = &stuff;

    // Here's the nasty stuff
    StuffProxy* stuffProxy = reinterpret_cast<StuffProxy*>(thing);
    int* addrX = &(stuffProxy->x); // Get the address of x
    std::cout << "x = " << *addrX << std::endl;

    typedef int (Stuff::*StuffFunc)();
    StuffFunc stuffFunc = (StuffFunc)(&StuffProxy::business);
    std::cout << "business() = " << (stuff.*stuffFunc)() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

x = 5
Have that 42 ... 
business() = 42
Run Code Online (Sandbox Code Playgroud)

Live Demo

上述工程,因为它保证classstruct将在一个C++编译器执行相同的布局,与各成员的可视性的编译过程中,唯一的区别.

因此,如果您具有类的布局(例如,从标题中),并且您愿意在项目的生命周期内维护它,则可以提供上述类似的代理来访问private类中的内容.