首页 > 代码库 > 程序挂在dynamic_cast<CCObject*>(pDelegate)->retain();

程序挂在dynamic_cast<CCObject*>(pDelegate)->retain();

CCTargetedTouchDelegate 的继承 和 dynamic_cast

想写个可以响应touch的sprite

类定义成了这个样子:

 

[cpp] view plaincopy
 
 
  1. class GemBoard : public CCSprite, CCTargetedTouchDelegate  


然后注册touch消息的时候

 

 

[cpp] view plaincopy
 
 
  1. CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);  


在这挂了,查了一下午,挂在了

 

-addTargetedDelegate

    -CCTargetedTouchHandler::handlerWithDelegate

        -initWithDelegate

             -CCTouchHandler::initWithDelegate

                  -dynamic_cast<CCObject*>(pDelegate)->retain();

                         -void CCObject::retain(void)

跟到这里,编译器告诉我CCObject的this指针是0,我晕呀。感觉太诡异了。

原因:CCTargetedTouchDelegate在上面的写法中是私有继承,而根据dynamic_cast的作用:(运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。)上面的情况就合情合理了。

今天学到了2个知识点:

1. class B: public A, C  这种情况下A是public继承,C是private继承;class B: A 这个A也是private继承

2.dynamic_cast 除了public 的其他都返回null

所以改成

[cpp] view plaincopy
 
 
  1. class GemBoard : public CCSprite, public CCTargetedTouchDelegate  

  //改成public继承就可以

就正确了。发现自己的c++基础真烂。

程序挂在dynamic_cast<CCObject*>(pDelegate)->retain();