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

骑着蜗牛去爬山 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
}
...全文
466 22 打赏 收藏 转发到动态 举报
写回复
用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)
网页中实现微信扫一扫,不用备案就能在自己网页中实现扫描二维码 有时我们只需要在自己网页中加入个扫一扫并且获取结果的小小功能就行,然而微信开发门槛太高,需要公众号需要交300块认证,然后域名还要备案,公众号后台需要各种配置,需要调用微信开发各个接口,最后可能并不会看到效果。 现在我要告诉你,你有救了!你只要简单使用上面提供的接口就行,什么论七八糟的统统都不用管了,只需要关注你的程序怎么处理这些数据。 不过任何事情都是相对的,本帖提供的方法缺点也是有的,就是多一次跳转,而大家都知道页面跳转那么当前输入框等控件内容都会丢失。不用担心,问题总是有方案解决的。 如果你只需要扫描下获取结果再处理,那么不用管这多跳转一次的问题。 如果你是在一个表单中某项需要扫描,那 么可以把扫描的那项提到最前面来,强制要用户必须先扫描才能填表单其他项,这样问题不 就迎刃而解了? 如果要追完美扫描不跳转,那么只能一步步按照微信网页开发的要来了。 大家都知道微信扫一扫,而且很常用,基本都用来扫码关注微信号,扫码付款,再之外的如果要扫的二维码是链接就直接打开访问,非链接的直接显示文字。 然而有时我们需要在自己的网页上调用扫一扫,然后按照自己的需要对获得结果进行处理该怎么办呢?有些同学觉得很奇怪,怎么会有这样的需。其实这样的使用场景很多的,例如: 扫快递单上的条形码查询它的进度 进度系统中可以根据生产单上条形码查询生产进度 发货系统出入库扫描 扫描网址只需截取其中的一个参数结果而不是直接打开它 。。。 看下面的一个应用效果。 https://img2.mukewang.com/5b42068700012bbf02800560.jpg 是不是很方便呢?微信里打开http://www.jiujiujin.net/wuliu.htm 也可以测试效果。 如果按照通常的步骤在自己网页中调用微信的扫一扫可不是那么简单的。首先得有微信公众号,公众号还得提交认证。我们都知道不光是注册个微信公众服务号就行,而且还得提交认证,每年交300块大洋,前提还必须是企业身份才能注册和认证。 接下来才是编码,这才是考验你耐心的时刻,各种不行,各种莫名其妙的错误,有些新手可能在域名备案上就被卡了半天,因为想要调用微信的jssdk接口要访问的域名必须是备案的,设置到微信公众号的js安全域名区,然后还要设置服务器白名单,如果你的是虚拟主机而ip不固定的说不定哪天就扫不了了。调用几个接口,参数,token还有7200秒的失效,定时更新还是访问时检查判断再更新,是不是弄过的人都纠结过?很是麻烦,顿时头大了有么有?水不是一般的深,于是纷纷哭爹喊娘大神骂张小龙。 我发现我废话太多了,说好的5行代码呢?却了这么多废话,哈哈哈。其实多了解了解也没坏处的,毕竟也算我的摸索过的心路历程。 上面给出的扫一扫指向的链接是:http://www.jiujiujin.net/wuliu.htm,聪明的同学已经打开并右击查看源代码了,可能已经明白是怎么回事了。 答案就是调用了一个接口,这个接口会去执行扫码,然后将扫码的结果作为一个参数返回到来路页面,这样来路页面中就可以获取并处理这个结果了。 废话不多说放代码测试。

64,646

社区成员

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

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