正在获取虚拟表指针c++
getting virtual table pointer c++
我有一个类,比如
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
实时演示
上述方法之所以有效,是因为它保证了class
和struct
在c++编译器实现中具有相同的布局,只是在编译过程中成员的可见性不同。
因此,如果你有一个类的布局(例如,从一个头),并且你愿意在项目的整个生命周期中维护它,你可以提供如上所述的代理来访问类中的private
内容。
访问private
成员x
:
1) 将需要访问x
的函数声明为类的朋友。
2) 更改对public
的访问权限。
3) 编写公共的getter或 setter4) 更改您的设计;其他类不应该知道成员变量。
这可能与编译器有关。我刚刚从指针"thing"中制作了一个char数组
char *array;
array = (char*)thing;
然后遍历该数组,直到找到私有变量
int x = array[8];
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错