i figure it out . addChild is a virtual function in CCNode , when CCSpriteBatchNode override CCSpriteBatchNode::addChild(CCNode *child, int zOrder, int tag), CCNode::addChild will also call CCSpriteBatchNode’s addChild