如何在cocosdx中修复钻石子类化

How to fix diamond subclassing in cocosdx

本文关键字:钻石 子类 cocosdx      更新时间:2023-10-16

有一个基类:

class MTBGameObject : public CCNodeRGBA

和我创建了另外两个类:

class MTBGamePlayer : virtual public MTBGameObject, virtual public CCSprite
class MTBGameObstacle : virtual public MTBGameObject

但现在我无法使用MTBGamePlayer的任何属性,我不能cast它

我一直在寻找解决这个问题的方法,但是一无所获。所以我想到了这个解决方案,我知道这不是最好的,但除非它工作良好。

class MTBGameObject {
    ...
    virtual CCNodeRGBA* self() = 0;
}

然后在子类中我必须重写self function

class MTBGamePlayer : public MTBGameObject, public CCNodeRGBA {
    ...
    CCNodeRGBA* MTBGameObstacle::self() {
        CCNodeRGBA* node = dynamic_cast<CCNodeRGBA*>(this);
        return node;
    }
}
class MTBGameObstacle : public CCSprite, public MTBGameObject {
    ...
    CCNodeRGBA* MTBGamePlayer::self() {
        CCNodeRGBA* node = dynamic_cast<CCNodeRGBA*>(this);
        return node;
    }   
}