Я пытаюсь понять, как работает двойная диспетчеризация. Я создал пример, где монстр и воин, полученные из абстрактного класса Существо, могли сражаться. Класс Существо имеет метод "сражаться", который определяется в производных классах, и в каждом производном классе определяется, что произойдет, если воин борется с воином или с монстром и т.д. Я написал следующий код:
#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: ошибка:" класс Существо не имеет имени с именем "fightwho
ex12_10.cpp: В функции члена "виртуальный void Warrior:: fight (Существо и amp;): ex12_10.cpp: 24: 29: ошибка:" класс Существо не имеет имени с именем "fightwho
Но я не знаю, как исходить отсюда... Пожалуйста, помогите.