你可以看看我写的这篇文章
http://www.cnblogs.com/Aplo/archive/2007/09/07/886145.html
这个实现了普通成员函数和虚函数的调用方法,你可以看源码的实现过程。根据你的需求去修改。
我实现的就是类似于C#的delegate。个人感觉封装的还不错。哈哈,欢迎拍砖。
另外关于“成员函数调用大多数情况都需要传入this指针”,我只是分析你的代码得出的结论,因为我没有测试过不敢妄下结论,因为你调用
virtual void _cdecl fun()
{
std::cout<<"virtual";
}
时并没有传入this,如果你测试过并且编译运行没有错的话,就可以得出一个结论,那就是在成员函数内没有使用成员数据的编译器可能不会传入this指针。这样这个函数就和普通的静态函数没有区别,可以随处调用而不会引起栈的问题。但是如果需要传入this(可能是通过ECX或是Push this,确实会有这两种情况)就会引起非法内存访问或是栈地址不对的问题。
静态方法我从没有怀疑啊,
此外,公共,私有,保护和这里讨论的内容没有关系,是否是虚函数和普通成员函数可能会有关系(我没有具体调试过,但是碰到过虚函数的this是通过压栈传入函数的,而普通成员函数确是通过ECX传入函数的你自己可以调试看),
你这种做法总体来说是比较危险的,所以还是尽量使用C++自带操作符,也可以参照boost中的function。
我晕,这和虚函数没有关系,成员函数调用大多数情况都需要传入this指针,但是绝对不是想你那样传,一般来说this指针会在函数调用之前传给ECX寄存器,而不是作为参数传入,虚函数可能会将this指针压入栈(这种做法等同于传参),这两种处理方法是不一样的。博主可以用C++自带的操作符
->* 或 .*
实现成员函数的调用。
To:flyman
你这个可是大错特错,虽然现在编译没有问题,你可以试试在
virtual void _cdecl fun()
{
std::cout<<"virtual";
}
这个虚函数里调用成员变量试试,肯定出错。为什么呢,因为对象方法在调用的时候需要传入this指针,而你这种做法把它转换成了静态方法。肯定是不可行的。而且你这种强制转化很容易出错,错误原因就是我上面说的。
你可以看一下这篇文章,将的是C++成员函数调用的方法。
http://www.cnblogs.com/Aplo/archive/2007/09/07/886145.html