子类如何安全的用一个基类的实例cast出来?

例如一个继承于Sprite的类npcSprite,只多了两个成员变量int x和int y,为了最简单起见直接是public的,都不用set,get

用cocos studio做npc动画的话

可以这样获得基类Sprite的一个实例
auto npc_orig = dynamic_cast<Sprite*>(rootNode->getChildByName(“npc_1”));

如何让获得的实例比较安全的转换成npcSprite的实例呢?? 用dynamic_cast肯定是不行的。
像下面这样static_cast

auto npc = static_cast<npcSprite*>(rootNode->getChildByName(“npc_1”));

npc->x = 1;
npc->y = 2;

这样倒编译没啥问题,但感觉正确用法不应该是这样,这样很可能搞出野指针或者越界。

不知道正确的方法应该如何做。。。

用dynamic_cast 转换失败会返回nullptr指针

这样没问题,你确定被转换的指针指向的是一个npcSprite,再用static_cast<npcSprite*>是安全的。

— Begin quote from ____

引用第2楼45672276于2015-02-09 09:55发表的 :
这样没问题,你确定被转换的指针指向的是一个npcSprite,再用static_cast<npcSprite*>是安全的。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=284934&pid=1240473

— End quote

但用cocosstudio做完的肯定只是基类Sprite的。强制用static_cast转成npcSprite感觉有隐患。。

我目前只能是用一个类里包含一个成员 Sprite* 来做。难道这是唯一的办法么。

你指针地址不变,static_cast只是告诉编译器指针所指的对象的大小,所以转换前指针虽然是Sprite*,但是如果实际指向的是npcSprite对象,那么用static_cast<npcSprite*>是安全的,只是要确保转换的时候指针有效,即指向的是npcSprite对象即可,static_cast本来就是告诉编译器你知道转换是安全,所以不用检查,就像你可以用auto npc_orig = dynamic_cast<void*>(rootNode->getChildByName(“npc_1”));即转换成void指针,然后用auto npc = static_cast<npcSprite>(rootNode->getChildByName(“npc_1”));也是可以的。这样不用考虑需要从什么类型的指针转换成npcSprite*。

好吧,我没看清楚你的问题,以为你问的是转换的问题,你用cocosstudio做完的基类Sprite怎么转换成npcSprite我不知道。。。我以为你转换前对象就是npcSprite了。。这种都用组合不用继承吧,就和你的做法一样,用一个类里包含一个成员 Sprite* 来做是正确的

你用cocostudio做自定义控件?要不然getChild怎么可能得到npcSprite?

推荐多使用组合而不是继承,cocos2dx中推荐使用组合会更灵活些。
把对象Sprite作为类的一个属性,再加上你自己的x、y等类属性即可:2:

标题说法有错误。下转型没有安全的。只能够是实例本来就是子类对象,只不过一开始是用父类指针引用着。不然,父类对象是没有子类对象多出来的成员的。没用过cc studio,不知道具体情况