函数指针和成员函数指针求解,编译器混乱了吗?

cute兵长 2013-01-19 11:13:45




class Event
{
public:
};
class MouseEvent:public Event
{
public:
};
class BaseClass;
typedef void (BaseClass::*ThisCall)(Event&);
typedef void (*Cdecl)(Event&);
struct question
{
ThisCall pfnThisCall;
Cdecl pfnCdecl;
};
class BaseClass
{
protected:

public:
void GiveMeFunction( ThisCall func )
{
Event e;
(this->*func)(e);
}
virtual void vir(Event&)
{
printf("vir base\r\n");
}
};
class SClass :public BaseClass
{
public:
void GiveMeFunction( void (SClass::*func)(MouseEvent&))
{
BaseClass::GiveMeFunction( (ThisCall)func );
}
virtual void vir(MouseEvent&)
{
printf("vir SClass\r\n");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
SClass s;
s.GiveMeFunction(&SClass::vir);
return 0;
}





问:
为什么上面代码编译不过
如果我把结构体struct question改为


struct question
{
// ThisCall pfnThisCall;
Cdecl pfnCdecl;
};


就能编译过,和解?(我是用vs2010)
...全文
203 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cute兵长 2013-01-30
  • 打赏
  • 举报
回复
我都忘结贴了。
zhangtonghui816 2013-01-20
  • 打赏
  • 举报
回复
你的ThisCall是你定义的神马类?
pathuang68 2013-01-20
  • 打赏
  • 举报
回复
成员函数指针是不能转换的。
lvjing_CSDN 2013-01-20
  • 打赏
  • 举报
回复
我也注意到了你说的这一点:原程序在gcc4.6.2中编译可以完全通过,在vc11中就报错,然后正如你说说,注释掉ThisCall pfnThisCall;就可以编译通过。从一个类成员指针到另一个类成员指针的转换是不建议这么干的。对于为什么会出现这种问题,我不知道,但是我觉得我明白你这么写的初衷:你是不是想在父类中的一个函数中调用一个来自子类的函数?我觉得可以使用虚函数来实现。就是在父类中希望调用子类函数的函数中使用this调用一个虚函数即可,如:
#include<stdio.h>
#include<iostream>
using std::cout;
using std::endl;
class Event
{
public:
};
class MouseEvent:public Event
{
public:
};
class BaseClass;
typedef void (BaseClass::*ThisCall)(Event&);
typedef void (*Cdecl)(Event&);
class BaseClass
{
protected:

public:
    void GiveMeFunction( )
    {
        Event e;
        this->vir(e);
    }
    virtual void vir(Event&)
    {
        printf("vir base\r\n");
    }
};
class SClass :public BaseClass
{
public:
    virtual void vir(Event&)
    {
        printf("vir SClass\r\n");
    }
};
int main(int argc, char* argv[])
{
    SClass s;
    s.GiveMeFunction();
    return 0;
}
还有就是,在你的 SClass类中的vir函数并没有覆盖你的父类中的vir,因为他们两个的形参不一样,他们两个是两个函数,只不过在子类中屏蔽了父类中的哪个虚函数。
prajna 2013-01-20
  • 打赏
  • 举报
回复
class Event { public: }; class MouseEvent:public Event { public: }; class BaseClass { protected: public: void GiveMeFunction( ThisCall func ) { Event e; (this->*func)(e); } virtual void vir(Event&) { printf("vir base\r\n"); } }; class SClass :public BaseClass { public: void GiveMeFunction( void (SClass::*func)(MouseEvent&)) { BaseClass::GiveMeFunction( (ThisCall)func ); } virtual void vir(MouseEvent&) { printf("vir SClass\r\n"); } }; typedef void (BaseClass::*ThisCall)(Event&); typedef void (*Cdecl)(Event&); struct question { ThisCall pfnThisCall; Cdecl pfnCdecl; }; int _tmain(int argc, _TCHAR* argv[]) { SClass s; s.GiveMeFunction(&SClass::vir); return 0; }
startservice 2013-01-20
  • 打赏
  • 举报
回复
ThisCall是LZ定义的一个成员函数指针吧。

64,282

社区成员

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

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