求大神方法重定向怎么写?

骑着蜗牛去爬山 2017-12-04 09:39:48
意思是这样的
class A{
function a(){
print("123");
}
}

main(){
A a1=new A();
a1.a();//输出123
a1.a=()->{ print('124');}; //这里怎么写???
a1.a();//输出124
}
...全文
471 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2017-12-06
  • 打赏
  • 举报
回复
不是虚函数的话是没有办法的, 编译 a1.a() 的时候就直接使用函数的地址了, 没有中间层. 如果原来的代码是在一个 lib 里面, 可以试试自己实现一个 A::a() 然后让连接器连接的时候优先使用你实现的 A::a 而不使用 lib 中的 A::a
ztenv 版主 2017-12-06
  • 打赏
  • 举报
回复
方法应该有很多,主要还是看你的需求,
  • 打赏
  • 举报
回复
那你写一个新的B.so,里面只包含有问题的API的修正版,然后修改APP源码,把调用A.so中那个API的部分修改成调用B.so的对应API,其余功能仍然使用A.so。
  • 打赏
  • 举报
回复
引用 15 楼 adlay 的回复:
不是虚函数的话是没有办法的, 编译 a1.a() 的时候就直接使用函数的地址了, 没有中间层
引用 18 楼 Saleayas 的回复:
我看了上面的东东,估计是 Android APP 呼叫了 .so 这样的库。
引用 17 楼 DelphiGuy 的回复:
如果是用Delphi的class helpers,或者C#的extension methods,轻松自己写个方法替换某类中的方法
引用 19 楼 wodexiaojidan 的回复:
用函数对象应该可以
谢谢各位大神的回复,看来是没啥好方法了。没源码就是一个坑啊。 就像wodexiaojidan 说的,应该不适合我,我的是Android调JNI。 Android调封装好的so文件(注意,这个so文件没问题,那没问题为什么会闪退呢?),so文件里调用了一个系统方法 env->NetStringUTF(const char*) 目的是把C++的字符串转为java可识别的string 然后这个系统方法的业务逻辑是这样(检查const char*是否合法 哦天啊是不合法的,转换之后又乱码。 好吧,我调用abortMaybe()了。 abortMaybe:我被调用了啊,嗯,我的实现方法里有行代码就是关闭java虚拟机。),然后java虚拟机关闭了,app闪退了。 这么说还不明白的话看下面 好比你写了个c++项目,项目里用到了一个不可更改的dll文件A。 dll文件调用系统dll的一个api 然后api调用了个关机命令,电脑关机了。呵呵哒。 这个时候你能说A有问题吗?能重写A吗?几乎不可能,这个超级麻烦。
wodexiaojidan 2017-12-06
  • 打赏
  • 举报
回复
用函数对象应该可以
Saleayas 2017-12-06
  • 打赏
  • 举报
回复
我看了上面的东东,估计是 Android APP 呼叫了 .so 这样的库。 如果是这样,你使用一个中间层,完成原来的 .so 提供的到处方法。 所有的方法都直接调用原来的方法,只有你需要的修改的函数,调用你需要修改的部分。 这样 替换之后, 上层是感觉不到的。 如果是在编译的时候,那么就不是使用 .so 库,而是使用 .lib 库,那么很简单,修改调用方源码。 如果调用方也是库的话,我的想法是使用二进制编辑器修改一下有问题的函数名,然后自己重新写一个,加入编译。
  • 打赏
  • 举报
回复
如果是用Delphi的class helpers,或者C#的extension methods,轻松自己写个方法替换某类中的方法,不需要修改某类或者从其派生新类,但是C++不支持这功能(等于白说了 )。
wzy765280843 2017-12-06
  • 打赏
  • 举报
回复
我也想认真的向大家学习
Sunjihang_123 2017-12-05
  • 打赏
  • 举报
回复
重新翻看一下C++primer,还有我记得C primer plus 有记载
mukexi 2017-12-05
  • 打赏
  • 举报
回复
重写了,只能
mstlq 2017-12-05
  • 打赏
  • 举报
回复
引用 10 楼 paschen 的回复:
[quote=引用 5 楼 骑着蜗牛去爬山的回复:][quote=引用 3 楼 paschen 的回复:] 没有这样的语法,你要的重定向是重定向到哪?重定向到文件、字符串、或者别的什么
classA a=new classA();//classA是封装好的,无法修改 a.func() //有bug a.func=mFunc;//想方法把a.func指向自定义的方法 a.func() //无bug[/quote] 如果他是个类,你可以继承自他,然后在你的类中编写同名函数,如果是别人已经生成好的代码,你要让他去调用你的函数将会比较复杂,你可以反汇编生成的程序,将调用那个函数的地址改成你的函数的地址,或者你参照Detours的写法,虽然Detours更多的是用于拦截API[/quote] 此法甚好,楼主可以参考呀
  • 打赏
  • 举报
回复
看意思好像没有源码,那就是破解
paschen 版主 2017-12-04
  • 打赏
  • 举报
回复
引用 5 楼 骑着蜗牛去爬山的回复:
[quote=引用 3 楼 paschen 的回复:] 没有这样的语法,你要的重定向是重定向到哪?重定向到文件、字符串、或者别的什么
classA a=new classA();//classA是封装好的,无法修改 a.func() //有bug a.func=mFunc;//想方法把a.func指向自定义的方法 a.func() //无bug[/quote] 如果他是个类,你可以继承自他,然后在你的类中编写同名函数,如果是别人已经生成好的代码,你要让他去调用你的函数将会比较复杂,你可以反汇编生成的程序,将调用那个函数的地址改成你的函数的地址,或者你参照Detours的写法,虽然Detours更多的是用于拦截API
  • 打赏
  • 举报
回复
引用 8 楼 arpnet99 的回复:
OutputDebugString
没用的,这不是个exception,这个是逻辑问题。 我就想知道C++有没有可能实现方法的重新指向。 就好比java的反射,或者JavaScript的 obj.func=function(){alert('a')};obj.func(); obj.func=function(){alert('b'')};obj.func() 现实情况是: Android app调用了一个封装好的C++代码,C++代码里调用了一个系统方法system.function。系统方法校验数据失败后,调用了abortMaybe()方法,abortMaybe()里面,退出了java虚拟机,app闪退。 想要实现的: 可以获取实例system,将system.function重新指向一个自定义的方法,然后就算校验失败也不会调用abortMaybe退出虚拟机了。
这不是鸭头 2017-12-04
  • 打赏
  • 举报
回复
OutputDebugString
  • 打赏
  • 举报
回复
引用 6 楼 ananluowei 的回复:
继承,然后重写方法?
代码里都写死了的 classA =new classA(); 继承是生成个classB,没啥用吧。 已经确定必须调用classA.func()了
大尾巴猫 2017-12-04
  • 打赏
  • 举报
回复
继承,然后重写方法?
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
没有这样的语法,你要的重定向是重定向到哪?重定向到文件、字符串、或者别的什么
classA a=new classA();//classA是封装好的,无法修改 a.func() //有bug a.func=mFunc;//想方法把a.func指向自定义的方法 a.func() //无bug
  • 打赏
  • 举报
回复
引用 3 楼 paschen 的回复:
没有这样的语法,你要的重定向是重定向到哪?重定向到文件、字符串、或者别的什么
是这样的,有个封装好的sdk,里面有个bug,无法改他的代码,只能想方法更改他的方法,指向一个自己写的没有bug的方法。
paschen 版主 2017-12-04
  • 打赏
  • 举报
回复
没有这样的语法,你要的重定向是重定向到哪?重定向到文件、字符串、或者别的什么
加载更多回复(2)

65,186

社区成员

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

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