我有一个班级如
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的指针和指向该类的虚函数表的指针?
编辑:澄清这是一个发送给我的挑战,我已经确信这不是一个技巧问题.
如何使用指针"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)
上述工程,因为它保证class和struct将在一个C++编译器执行相同的布局,与各成员的可视性的编译过程中,唯一的区别.
因此,如果您具有类的布局(例如,从标题中),并且您愿意在项目的生命周期内维护它,则可以提供上述类似的代理来访问private类中的内容.