#include
#include
using namespace std;
class Futter {
public:
Futter () {cout << "Futter" << endl;}
virtual string name () = 0;
};
class Tier {
public:
Tier () {cout << "Tier" << endl;}
virtual Futter * create () {cout << "Can't do that!" << endl;}
virtual void friss (Futter * t) = 0;
};
class Gras : public Futter {
public:
Gras () {name();}
virtual string name () {return "Gras";}
};
class Kuh : public Tier {
public:
Kuh () {cout << "Kuh" << endl;}
virtual Futter * create () {return new Gras;}
virtual void friss (Futter * t) {cout << "mmh, gut " << t->name() << endl;}
};
class Fleisch : public Futter {
public:
Fleisch() {cout << name() << endl;}
virtual string name () {return "Fleisch";}
};
class Tiger: public Tier {
public:
Tiger () {cout << "Tiger" << endl;}
virtual Futter * create () {return new Fleisch;}
virtual void friss (Futter * t) {cout << "mmh, gut " << t->name() << endl;}
};
class Banane : public Futter {
public:
Banane() {cout << name() << endl;}
virtual string name () {return "Banane";}
};
class Affe: public Tier {
public:
Affe () {cout << "Affe" << endl;}
virtual Futter * create () {return new Banane;}
virtual void friss (Futter * t) {
if (typeid(t) == typeid(Banane)) {cout << "mmh, gut " << t->name() << endl;}
else {cout << "will das nicht" << endl;}
}
};
template
class Zoo : public Tier {
Tier * p;
public:
Zoo() : p(0) {}
virtual Tier* instantiate() {if (p==0) p = new Tier(); return p;}
virtual void friss (Futter * t) {cout << "Kein futter für mich" << endl;}
};
int main()
{
Tier * k = new Kuh;
k->friss (k->create());
Tier * t = new Tiger;
t->friss (t->create());
Zoo * z = new Zoo ;
Tier * a = z->instantiate();
a->friss(a->create());
a->friss(t->create());
}