正在获取虚拟表指针c++

getting virtual table pointer c++

本文关键字:指针 c++ 虚拟 获取      更新时间:2023-10-16

我有一个类,比如

class Stuff
{
private:
int x;
virtual int buisness()
{
return 42;
}
public:
Stuff(){
x = 5;
}

给定一个指向此类实例的指针

Stuff stuff;
void* thing = &stuff;

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

编辑:澄清这是一个发给我的挑战,我已经得到保证,这不是一个欺骗问题。

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

如果不将thing转换回原始类型:

Stuff* stuff2 = reinterpret_cast<Stuff*>(thing);

至少这并不能让你从该类的隐私策略以及如何公开访问类成员指针中解脱出来。

实际布局是由实现定义的,尝试使用thing的偏移量和大小假设超出了标准c++机制。


听起来您想要绕过具有已知成员布局的类的private成员访问策略。这里有一个极其肮脏的黑客:
免责声明:不要在生产代码中这样做

#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;
}

输出:

x = 5
Have that 42 ... 
business() = 42

实时演示

上述方法之所以有效,是因为它保证了classstruct在c++编译器实现中具有相同的布局,只是在编译过程中成员的可见性不同。

因此,如果你有一个类的布局(例如,从一个头),并且你愿意在项目的整个生命周期中维护它,你可以提供如上所述的代理来访问类中的private内容。

访问private成员x:

1) 将需要访问x的函数声明为类的朋友。

2) 更改对public的访问权限。

3) 编写公共的getter

setter4) 更改您的设计;其他类不应该知道成员变量。

这可能与编译器有关。我刚刚从指针"thing"中制作了一个char数组

char *array;
array = (char*)thing;

然后遍历该数组,直到找到私有变量

int x = array[8];