【问题描述】
原本我使用的是 cocos2d-x v3.2 版本的,我自己写了一个C++的类(假设为 PanZoomLayer ),然后对Node类的 setPosition 进行了重载。然后绑定Lua,提供Lua调用此类。
本来在 v3.2 版本的引擎中使用时没有任何问题的。
后来我将引擎换成了 v3.3 版本的,可是问题来了:我自己写的PanZoomLayer 类,所重载的 setPosition 出现了死循环(stack overflow)。
后来找了找原因,终于发现了,这个难道就是传说中的BUG么???
【问题分析】
一、我们先来看 3.2 和 3.3 版本的Node类中是如何实现 setPosition 的。
1、在 3.2 中是这样的:

<img title = '3.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_a1b8fecf0cc041c.png' >
2、而在 3.3 中却是这样的:
<img title = '5.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_991fd4f6ba8b0b8.png' >
<img title = '6.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_ba8e2067a1af573.png' >
二、而我自定义的PanZoomLayer 类对setPosition的重载是这样写的:
<img title = '1.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_8a98109fb08ac0e.png' >
<img title = '4.png' src='http://cdn.cocimg.com/bbs/attachment/Fid_41/41_311318_11875e7be65ca1d.png' >
三、可是呢,我在我自定义的类中调用:this->setPosition( Vec2(x, y) ); 时,所重载的 setPosition 出现了死循环(stack overflow)。
他所调用的顺序会是这样的:
1、首先,调用 this->setPosition( Vec2(x, y) );
2、然后,进入PanZoomLayer 类的 setPosition( const Vec2& position );
3、然后,执行 Node::setPosition(position);
4、然后,执行 Node 类中 void Node::setPosition(const Vec2& position) 里的语句 setPosition(position.x, position.y);
5、问题来了!!!
顺序4 中的 setPosition(position.x, position.y); 调用的竟然是 PanZoomLayer 类中的 void setPosition(float x, float y);
6、然后陷入了死循环。。。
【自行解决方案】
我将引擎cocos v3.3 中的Node类的 setPosition(const Vec2& position) 里的语句 setPosition(position.x, position.y);
更改为:Node::setPosition(position.x, position.y);
也就是在前面加上 “ Node:: ” 后,得到了解决。
此时,Node::setPosition(position.x, position.y); 调用的将是 Node 类中的 setPosition(float x, float y); 。而不是我自己定义的类 PanZoomLayer 类中的 void setPosition(float x, float y);
【总结】
可能大家都没有遇到过这样的问题。
因为我遇到了,所以特此发帖,希望小伙伴们不要踩坑。。。
【补充说明】
在上述代码中,可以发现:其实在 v3.2 中也出现了这个问题。
如果我再自定义的HelloWorld 类中,对 setPosition 的重载是如下写法。
那么我在自定义的 HelloWorld 类中,调用 this->setPosition(Vec2(x, y));
也会出现同样的问题:死循环(stack overflow)。

是啊。。。这样 调用 是会 死循环的 可以 调用 继承 的 Sprite::setposition(x,y)