簡體   English   中英

C ++類繼承

[英]C++ classes inheritance

我有兩節課:

class CEnemy : CObject
{
protected:
    int hitPoints;
};
class COgro : public CEnemy
{
    COgro::COgro() {hitPoints = 100}
};

在其他文件中,我有類“ CRocket”,可以與COgro發生沖突,它具有以下功能:

void CRocket::OnCollision(CObject *collisionObject)
{
    if (typeid(*collisionObject) == typeid(COgro))
    {
        //collisionObject->hitPoints -= 10; ?? or what?
    }
}

我想在死之前先拍10次。 這個怎么做? 我已經嘗試過:

     collisionObject->hitPoints -= 10;
     (CEnemy)collisionObject->hitPoints -= 10;

但我無法編譯...如何編輯此hitPoints值,但不更改'(CObject * collisionObject)'? 謝謝

編輯:

//===============================================================

//------------------------------------CLASS CRocket-----------------------
class CRocket : public CObject
{
protected:
    void OnAnimate(scalar_t deltaTime);
    void OnCollision(CObject *collisionObject);
    void OnDraw(CCamera *camera);

public:

    float pitch;
    float distanceTravel;   
    CVector forward;        
    bool isExplosion;

    CTexture *explosionTex;
    CExplosion *explosion;

    CRocket();
    ~CRocket();

    void Load();
    void Unload();

};
void CRocket::OnCollision(CObject *collisionObject)
{
        if (typeid(*collisionObject) == typeid(COgroEnemy))
        {
            isExplosion = true;
            velocity = CVector(0.0, 0.0, 0.0);
            explosion = new CExplosion(500, position, 8.0, explosionTex->texID);
            PlaySound();
        }
}

//-----------------------------------------class CObject
class CObject : public CNode
{
protected:
    virtual void OnAnimate(scalar_t deltaTime)
    {
        position += velocity * deltaTime;
        velocity += acceleration * deltaTime;
    }
    virtual void OnDraw(CCamera *camera) {}
    virtual void OnCollision(CObject *collisionObject) {}

    virtual void OnPrepare()
    {
        ProcessCollisions(FindRoot());
    }

public:
    CVector position;
    CVector velocity;
    CVector acceleration;
    scalar_t size;

    bool isDead;

    CObject() {isDead = false;}
    ~CObject() {}
...
...
...
}

//---------------------------------------class CEnemy 
class CEnemy : public CObject
{
public:
    int hitPoints;
protected:

    float distFromPlayer;
    float runSpeed;
    AIState_t aiState;

    virtual void OnProcessAI() {}
    void OnCollision(CObject *collisionObject)
    {
          // if this enemy collides with another enemy
          if (typeid(*collisionObject) == typeid(CEnemy))
          {
               modelState = MODEL_IDLE;
               velocity = CVector(0.0, 0.0, 0.0);
          }
          // if this enemy collides with the terrain (always)
          else if (typeid(*collisionObject) == typeid(CTerrain))
          {
               position.y = ((CTerrain*)collisionObject)->GetHeight(position.x, position.z) + size;
          }
          else
          {
          }
     }

public:
    CPlayer *player;
...
...

//----------------------------------class COgro-------------------------
class COgroEnemy : public CEnemy
{
protected:
    void OnProcessAI();
    void OnCollision(CObject *collisionObject);
    void OnPrepare();

public:
    COgroEnemy() { Load(); }
    COgroEnemy(float x, float z) { position.x = x; position.z = z; Load(); }
    ~COgroEnemy() {}

    void Load();
};

您需要將指針CEnemy*轉換為指針類型CEnemy* (或子類),或者將取消引用的指針CEnemy&轉換為引用類型CEnemy& 為了獲得最大的安全性,我建議您使用dynamic_cast ,而不要使用邪惡的C樣式強制轉換; 盡管這有點偏執,因為您要在投放前檢查類型。

// no checks, undefined behaviour if type is wrong
((CEnemy*)collisionObject)->hitPoints -= 10;
static_cast<CEnemy*>(collisionObject)->hitPoints -= 10;

// throws if type is wrong
dynamic_cast<CEnemy&>(*collisionObject).hitPoints -= 10;

// does nothing if type is wrong
if (CEnemy* enemy = dynamic_cast<CEnemy*>(collisionObject)) {
    enemy->hitPoints -= 10;
}

您可以將其與類型檢查結合使用,而不是使用typeid

if (COgro * ogro = dynamic_cast<COgro*>(collisionObject)) {
    ogro->hitPoints -= 10;
}

請注意,這與您的測試並不完全相同:如果對象是COgro的子類型,則它將通過,而您的測試將檢查是否完全匹配。

您的代碼未編譯,因為您正試圖從外部源訪問類的受保護數據成員。

collisionObject參數是CObject的實例,它沒有hitPoints數據成員。

同樣,當您將指向基類的指針傳遞給函數時,這些函數應假定它們只能訪問基類的接口或功能。

您應該編寫另一個重載方法:

void CRocket::OnCollision(CEnemy& enemy);

或將hitPoints數據成員移動到CObject類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM