超难问题:修改虚函数表??????
事出有因,关于回调函数的,想写一个万能的仿函数类.我的仿函数类有一个虚函数fun,我想修改这个fun这个函数的地址,地址为一个传入的函数指针,比如有仿函数类Visit.有一个void fun(char s)成员函数;重载().
使用这个类的方法
void (*fun)(char s);//函数指针,任意绑定一个函数,这样这个仿函数类就可以一劳永逸了.
Visit v; //比如定义 void fun1(char s){...操作...}
v.Set(fun); //fun=fun1
char s;
v(s);
#include <iostream>
class Base
{
private:
virtual void fun1(){std::cout<<"Bsed::fun1"<<std::endl;}
};
void fun1(){std::cout<<"fun1"<<std::endl;}
void main()
{
typedef void(*Fun)(void);
Base b;
Fun pFun;
std::cout<<"虚函数表开始地址:"<<(int*)(&b)<<std::endl;
std::cout<<"虚函数列表中第一个虚函数地址:"<<(int*)*(int*)(&b)<<std::endl;
std::cout<<"changed:"<<std::endl;
int *a=(int*)*(int*)(&b);
std::cout<<"a:"<<a<<std::endl;
Fun pFun2=&fun1;
*a=*(int*)(pFun2);
std::cout<<*a;
std::cout<<"虚函数列表中第一个虚函数地址:"<<(int*)*(int*)(&b)<<std::endl;
}
这是我的代码,提供个思路,但是没有成功,
使用这个类的方法
void (*fun)(char s);//函数指针,任意绑定一个函数,这样这个仿函数类就可以一劳永逸了.
Visit v; //比如定义 void fun1(char s){...操作...}
v.Set(fun); //fun=fun1
char s;
v(s);
#include <iostream>
class Base
{
private:
virtual void fun1(){std::cout<<"Bsed::fun1"<<std::endl;}
};
void fun1(){std::cout<<"fun1"<<std::endl;}
void main()
{
typedef void(*Fun)(void);
Base b;
Fun pFun;
std::cout<<"虚函数表开始地址:"<<(int*)(&b)<<std::endl;
std::cout<<"虚函数列表中第一个虚函数地址:"<<(int*)*(int*)(&b)<<std::endl;
std::cout<<"changed:"<<std::endl;
int *a=(int*)*(int*)(&b);
std::cout<<"a:"<<a<<std::endl;
Fun pFun2=&fun1;
*a=*(int*)(pFun2);
std::cout<<*a;
std::cout<<"虚函数列表中第一个虚函数地址:"<<(int*)*(int*)(&b)<<std::endl;
}
这是我的代码,提供个思路,但是没有成功,
...全文
相关推荐
魂斗罗1代50人超难版.rar
魂斗罗1代50人超难版
C++虚函数表原理浅析
C++虚函数表和对象存储C++中的虚函数实现了多态的机制,也就是用父类型指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”,这也是一种泛...
P问题、NP难问题详解
P问题、NP难问题详解 总结: 定义:同时满足下面两个条件的问题就是NPC问题。首先,它得是一个NP问题;然后,所有的NP问题都可以约化到它。 证明:先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它
脑筋急转弯超难及答案超难的脑筋急转弯及答案分享.doc
脑筋急转弯超难及答案超难的脑筋急转弯及答案分享.doc
超难Flash游戏
两款超难的flash小游戏,一个是世界上最难的游戏,本人已经通关,的确很难,另一个是四个游戏同时玩,看你能坚持多长时间,本人试过几次,最好成绩是130秒,看看你能不能“一心四用”。


