大神帮忙看看:刚想到一种奇怪用法,类的成员函数指针纯虚基类调用,可以正确执行,不知道理论上是否正确

万大侠 2013-10-27 08:03:52
大神帮忙看看:刚想到一种奇怪用法,类的成员函数指针纯虚基类调用,可以正确执行,不知道理论上是否正确
上代码:

class CW_iTest;

/*指向类的非静态成员函数的指针*/
typedef void (CW_iTest::*pClassFun)( LPCSTR s );

class CW_iTest
{
public:
virtual void test_1( LPCSTR s ) = 0;
};



struct SW_Test
{
CW_iTest* pTest;
pClassFun pFun;

void test( LPCSTR s )
{
(pTest->*pFun)( s );
}
};



class CW_Test :public CW_iTest
{
public:
CW_Test(void) {};
~CW_Test(void) {};
public:
virtual void test_1( LPCSTR s ) {};

public:
void test_2( LPCSTR s ) {

MessageBoxA(NULL ,s ,"",0);
}


};


////////////////////////////////////////////////////////////////
// TODO: 在此添加控件通知处理程序代码
CW_Test test;

SW_Test struct_test;
struct_test.pTest = &test;
struct_test.pFun = (pClassFun)( &CW_Test::test_2 );

struct_test.test( "点击按钮" );

...全文
138 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
万大侠 2013-10-27
  • 打赏
  • 举报
回复
测试了 楼上的用法应该是作为一个全局的函数在调用 所以也可以执行 这个用法应该没错,注册出去的事件(函数) ,在外部调用时可以正确执行 这个功能是用来注册各种事件的
万大侠 2013-10-27
  • 打赏
  • 举报
回复
楼上说的很像也是 这种用法说不清楚了。。。。。。。。。。
万大侠 2013-10-27
  • 打赏
  • 举报
回复
我感觉是没错 因为函数也是个指针地址 传输过来的对象指针 在同一个偏移地址寻址 应该没错 求大神确定。
  • 打赏
  • 举报
回复
class Mod{ public: void foo(std::string s){ int i; } }; struct_test.pFun = (pClassFun)(&Mod::foo); struct_test.test( "点击按钮" ); 也完全正常,可见与虚基类无关,只要函数签名一样就行了
  • 打赏
  • 举报
回复
无量天尊,万大侠,老衲有礼了,这与虚基类什么的无关下,下列代表也能正常呀 在你的代码中,添加如下: class Mod{ public: void foo(){} }; pClassFun p= (pClassFun)(&Mod::foo); 运行也正常呀
万大侠 2013-10-27
  • 打赏
  • 举报
回复
运行过了 就怕碰巧正常
worldy 2013-10-27
  • 打赏
  • 举报
回复
实践是检验真理的唯一标准,LZ试试不就知道了?
lm_whales 2013-10-27
  • 打赏
  • 举报
回复
成员指针,没有问题,MFC就是这么干的。
万大侠 2013-10-27
  • 打赏
  • 举报
回复
琢磨了一夜。。。。。。。。。。。。。。。。。。。。。谢谢
lm_whales 2013-10-27
  • 打赏
  • 举报
回复
->* 看到没有成员指针类型::*; 使用: .*; //对象和引用使用 ->*;//指针使用

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧