读书人

函数指针跟成员函数指针求解编译器混

发布时间: 2013-02-15 15:46:56 作者: rapoo

函数指针和成员函数指针求解,编译器混乱了吗?
本帖最后由 css433411 于 2013-01-19 23:15:57 编辑





class Event
{
public:
};
class MouseEvent:public Event
{
public:
};
class BaseClass;
typedef void (BaseClass::*ThisCall)(Event&);
typedef void (*Cdecl)(Event&);
struct question
{
ThisCall pfnThisCall;
CdeclpfnCdecl;
};
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;
CdeclpfnCdecl;
};


就能编译过,和解?(我是用vs2010)
[解决办法]
我也注意到了你说的这一点:原程序在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,因为他们两个的形参不一样,他们两个是两个函数,只不过在子类中屏蔽了父类中的哪个虚函数。

读书人网 >C++

热点推荐