我正在爲學校的一個小遊戲項目工作,我碰到了碰撞和東西爲我的對象工作,並且想法是檢查一個對象是否與另一個對象碰撞,然後讓每個類型的具體邏輯有一堆例如,如果對象是一個玩家控制的對象,敵人會傷害它,但如果它是一個加電與敵人相撞,事情會很好。
所以,我希望我可以做這樣的事情(一切從繼承的OBJ明顯):
std::vector<Obj*> list;
list.push_back(new Powerup());
list.push_back(new Enemy());
list.push_back(new Player());
for (auto i: list) {
for (auto j: list) {
if (collision(i,j)) {
i->doStuff(*j);
}
}
}
但是我無法找到一種方法在適當的類型來發送。我做了一個測試程序,證明了問題:
#include <iostream>
class A {
public:
virtual void doStuff(A& T) { std::cout << "A->A!" << std::endl; }
};
class B : public A {
public:
virtual void doStuff(A& T) { std::cout << "B->A!" << std::endl; }
};
class C : public A {
public:
virtual void doStuff(A& T) { std::cout << "C->A!" << std::endl; }
virtual void doStuff(B& T) { std::cout << "C->B!" << std::endl; }
};
int main() {
A* base;
A a;
B b;
C c;
c.doStuff(a);
c.doStuff(b);
base = &a;
c.doStuff(*base);
base = &b;
c.doStuff(*base);
return 0;
}
並運行它,我得到這個:
C->A!
C->B!
C->A!
C->A!
當我期待:
C->A!
C->B!
C->A!
C->B!
任何想法如何使這項工作?
好,所以我認爲我必須這樣做: void doStuff(A&T)A * a = dynamic_cast (T); B * b = dynamic_cast (T); if(a){ std :: cout << "C-> A!「<< std :: endl; } else if(b){ std :: cout << "C-> B!」 << std :: endl; } } 爲了得到想要的結果呢? 或者,我在主程序中執行if語句,但隨後我必須更改每個新類的主程序...:/ –
研究雙重調度。這是你想要的,如果你不想爲每種派生類型寫劇情。只有當你不知道B派生A時,動態轉換纔是有用的。如果B不派生A,它將返回'NULL' /'nullptr'。這是一個緩慢的運行時操作。如果你知道B派生出A,那麼使用'static_cast',否則你會得到UB。 – Gambit
明白了,謝謝! –