簡體   English   中英

將派生類轉換為基類

[英]Casting Derived class to base class

我遇到了一個棘手的小問題。 我認為這個問題與我鑄造東西的方式有關。

所以我有一個名為combatEntity的基類。 它具有以下功能

class combatEntity {
public:
    virtual void update();
};

然后我有一個類mob,它派生自combatEntity ,覆蓋了更新函數:

class mob : public combatEntity {
public:
    virtual void update();

}

然后我有一個名為monster的類,它來自mob並且還覆蓋了更新函數。

class monster: public mob {
public:
    virtual void update();
}

我有一個名為i的combatEntity指針:

combatEntity* i;

然后我有:

//returns a mob* pointer (needs explicit cast)
monster* newMonster = getMob();
i = newMonster;

getMob()函數:

mob* getMob() {
   mob* newMob = new mob();
   //set some data in newMob
   return newMob;
}

當我調用i->update() ,它調用mob::update() ,因為newMonster被設置為“new mob();”,因為getMob()返回一個新的mob指針。 當我調用i->update() ,我需要它來調用monster::update() ,但是使用斷點,我看到它調用的是mob::update()而不是monster::update()

所以我需要創建一個新的monster對象,但仍然有它的基類數據填充了從getMob()返回的對象,但是正確地覆蓋了這些函數。 我也嘗試過dynamic_cast,static_cast和reinterpret_cast,但似乎都沒有。 或者我需要將我的基類強制轉換為派生類,同時使用派生類正確覆蓋函數。

希望這樣做。 任何意見,將不勝感激。

查看您的層次結構樹,確保這些類與您的思考方式相關。

這段代碼

#include <iostream>

struct combatEntity
{
    virtual void Update() { std::cout << "Combat Entity\n"; };
};

struct mob : combatEntity
{
    virtual void Update() { std::cout << "Mob\n"; };
};

struct monster : mob
{
    virtual void Update() { std::cout << "Monster\n"; };
};

int main(int argc, char **argv)
{
    combatEntity *ce = new monster;
    ce->Update();
    delete ce;

    return 0;
}

創建此輸出:

Monster

資料來源: http//ideone.com/k6LAB

你的路線

monster* newMonster = getMob();

不應該編譯。 我明白了

error: invalid conversion from ‘mob*’ to ‘monster*’ [-fpermissive]

(也就是你的行i = monster;大概應該讀i = newMonster; )。 這就解釋了這一切,我認為(另見Luchian的評論)。

好吧,因為你正在使用虛擬,所以“update”將始終調用正確的函數,無論你聲明指針是什么。 這就是“虛擬”的運作方式。

如果你希望你的指針確定被調用的內容,而不是對象本身,那么使這些東西非虛擬。 在這種情況下,指針類型將確定調用哪個“更新”。

如果你想要兩者,你仍然可以調用類似monster :: update()而不僅僅是更新。 但是,除非您從派生類的更新函數(調用超類實現)中執行此操作,否則嘗試通過繼承層次結構可能是設計錯誤的標志。

暫無
暫無

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

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