ダブルディスパッチがどのように機能するかを理解しようとしています。抽象クラス Creature から派生したモンスターと戦士が戦う例を作成しました。クラスCreatureには、派生クラスで定義されたメソッド「fight」があり、各派生クラスでは、戦士が戦士またはモンスターなどと戦う場合に何が起こるかが定義されています。私は次のコードを書きました:
#include<iostream>
using namespace std;
class Monster;
class Warrior;
class Creature{
public:
virtual void fight(Creature&) =0;
};
class Monster: public Creature{
void fightwho(Warrior& w) {cout<<"Monster versus Warrior"<<endl; }
void fightwho(Monster& m) {cout<<"Monster versus Monster"<<endl; }
public:
void fight(Creature& c) {c.fightwho(*this);}
};
class Warrior: public Creature{
void fightwho(Warrior& w) {cout<<"Warrior versus Warrior"<<endl; }
void fightwho(Monster& m) {cout<<"Monster versus Warrior"<<endl; }
public:
void fight(Creature& c) {c.fightwho(*this);}
};
int main()
{
Warrior w;
Monster m;
w.fight(m);
}
これにより、コンパイラ エラーが発生します。
ex12_10.cpp: メンバー関数 'virtual void Monster::fight(Creature&)': ex12_10.cpp:17:30: エラー: 'class Creature' には 'fightwho' という名前のメンバーがありません
ex12_10.cpp: メンバー関数 'virtual void Warrior::fight(Creature&)': ex12_10.cpp:24:29: エラー: 'class Creature' には 'fightwho' という名前のメンバーがありません</p>
しかし、ここから先の進め方がわかりません... 助けてください。