多继承引发的诡异bug (cocos2d-x CCObject)

来源:互联网 发布:java rmi漏洞解决 编辑:程序博客网 时间:2024/06/01 09:51

       我有一个Singleton,用于处理下载信息,用到了HttpClient,那么就必须继承自CCObject,然后添加一个对应的函数指针来响应回调。由于同时还需要响应下载模块的信息回调,所以又继承自IDownloadEvent接口。

      结果引发了一个非常难查的内存Bug。当回调函数调用后,这个Singleton的所有数据都被篡改了,导致函数内各种崩溃。但是我检查了Singleton的地址,又确实没有被改变,同时看了HttpRequest里面保存的target对象(就是我这个Singleton),它的数据又是正确的(地址跟我的Singleton一样,证明确实是一个对象)。

      既然是同一个对象,地址又一样,为什么监视器中显示的变量数据完全不一样呢?

      我猜想是由于多继承引发的问题。现在只保留一个对CCObject的继承,然后就解决了问题。

     直到现在我还没有查明究竟是什么原因导致这个诡异的bug。但是可以明确多继承确实可能造成一些问题,是应该避免的。同时也说明使用继承的方式来完成监听者模式,在c++中不是一个很好的选择。即便继承的是只有纯虚函数的方法类,但是继承终究是继承,这个与java在语法层面实现接口的概念是不同的。

      总结,尽量避免多继承,使用委托的方式完成信息回调而不是继承的方式。

原创粉丝点击