[英]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.