当前位置: 代码迷 >> C++ >> 函数指针跟成员函数指针求解,编译器混乱了吗
  详细解决方案

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

热度:2156   发布时间:2013-02-26 00:00:00.0
函数指针和成员函数指针求解,编译器混乱了吗?
本帖最后由 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;
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)

------解决方案--------------------------------------------------------
我也注意到了你说的这一点:原程序在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,因为他们两个的形参不一样,他们两个是两个函数,只不过在子类中屏蔽了父类中的哪个虚函数。
  相关解决方案