C++类的成员函数访问与类的强制类型转换相关的问题

tendollor tendollor 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

我看到一种写法 觉得很奇怪 不理解其原理 请大家点评一下


//================================
//Processor.h
class Processor
{
//......
//.....

public:
static UINT __stdcall foo_process_wrapper(LPVOID param);
private:
void foo_process(LPVOID param);

}
extern Processor Proc;
//=============================



//=========================
//Processor.cpp

UINT __stdcall Processor::foo_process_wrapper(LPVOID param)
{
((Processor *)param)->foo_process( (my_param_type *)param );
}



Processor Proc;
//===========================






然后再某地方使用这个类

//================================
//test.cpp

#include "Processor.h"

int main()
{
int Threadaddr;
HANDLE m_handle;
char * buf = "test";
m_handle=(HANDLE)_beginthreadex

(NULL,256000,Proc.foo_process_wrapper,(LPVOID)

buf,0,&Threadaddr);


}
//================================



这样一来线程成功执行foo_process里的代码,建立多个线程也正常没有冲突



而我理解的Processor::foo_process_wrapper中的param参数理应是 传入的buf 他被转换成my_pargam_type也就是char*之后也能正常得到值

为什么可以用((Processor *)param)->foo_process这种方式访问成员函数呢

我再试过直接Processor * Ptest;
然后直接用(Processor *)Ptest->foo_process 程序是会出现内存访问错误崩溃的.

具体是什么个原理 和__stdcall的foo_process_wrapper压入栈的参数有关吗
然后我又测试了下 应该个__stdcall压入栈的参数没关 都自动处理过了

之前内存访问错误是因为指针没有分配内存空间

那么我随便给个空间就好了于是我定义了一个char* Ptest="test";
这样就有内存空间了,然后再强制转换(Processor *)Ptest->foo_process 就一切执行正常

是否是只要任何内容非空的可访问指针 都可以转换成Processor类型并访问类成员? 这其中的原理是什么?到底如何转换的?



...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
tendollor
C++ 语言 65,214 成员 250,514 内容