だから。C++ - 基本ポインタを使って子クラスのメソッドをオーバーライドする方法
私は学校のための小さなゲームプロジェクトに取り組んでいます。私はオブジェクトに衝突して作業をしています。オブジェクトは別のオブジェクトと衝突しているかどうかを確認し、例えば、オブジェクトがプレイヤーによって制御されるオブジェクトである場合、敵はそれを傷つけるが、それが敵と衝突するパワーアップであれば、大丈夫だろう。
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);
}
}
}
をしかし、私は適切な型に送信する方法を見つけるのトラブルを抱えている:
だから、私は(すべてが明らかにObjにから継承)私のような何かができる期待していました。
#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!
任意のアイデアをどのようにこの作品を作るために、私はこの問題を実証するテストプログラムを作ったのですか?
[OK]を、私は私のような何かをする必要があり、それを取る: 無効doStuff(A&T){ * A = dynamic_castを(T)を。 B * b = dynamic_cast (T); (A){ のstd :: COUT << "C-> A!もし "<<はstd :: ENDL; }!(B){ のstd :: COUT << "C-> Bもしそうでなければ" << std :: endl;その後、結果を得るために必要な }} ?/ –
は、二重派遣に見て: はまた、私は、メインプログラム内の文であれば、その後私は、すべての新しいクラスのメインプログラムを変更する必要が...あることを行います。派生型ごとにキャストを書く必要がないようにしたい場合は、これが必要です。動的キャスティングは、BがAを派生しているかどうかわからない場合にのみ有効です。BがAを派生しない場合、 'NULL' /' nullptr'を返します。あなたがBを派生していることを知っているならば 'static_cast'を使います。さもなければあなたはUBを得るでしょう。 – Gambit
ありがとう! –