#include <iostream>
#include <vector>
class Character;
class Human;
class Robot;
class Effect {
public:
virtual void apply(Character *c) { }
virtual void apply(Human *c) { }
virtual void apply(Robot *c) { }
};
class Character {
public:
virtual void accept(Effect *effect) = 0;
};
class Human : public Character {
public:
virtual void accept(Effect *effect)
{
effect->apply(this);
}
};
class Robot : public Character {
public:
virtual void accept(Effect *effect)
{
effect->apply(this);
}
};
class Fire : public Effect {
public:
virtual void apply(Human *c) { std::cout << "humans burn" << std::endl; }
};
class Shock : public Effect {
public:
virtual void apply(Robot *c) { std::cout << "robots get shocked" << std::endl; }
virtual void apply(Human *c) { std::cout << "humans get shocked" << std::endl; }
};
class Water : public Effect {
public:
virtual void apply(Robot *c) { std::cout << "robots don't like water" << std::endl; }
};
int main()
{
std::vector<Character*> characters;
characters.push_back(new Robot());
characters.push_back(new Human());
std::cout << "Fire:" << std::endl;
Effect *fire = new Fire();
for(size_t i = 0;i<characters.size();++i)
{
characters[i]->accept(fire);
}
std::cout << "Shock:" << std::endl;
Effect *shock = new Shock();
for(size_t i = 0;i<characters.size();++i)
{
characters[i]->accept(shock);
}
std::cout << "Water:" << std::endl;
Effect *water = new Water();
for(size_t i = 0;i<characters.size();++i)
{
characters[i]->accept(water);
}
// totally leaked some memory
}