#include <iostream>
#include <list>
#include <algorithm>
#include <string>

using namespace std;

class Hond {
private:
	string n;
public:
	virtual ~Hond() {
	}
	string naam() const {
		return n;
	}
	void geefNaam(const string& s) {
		 n=s;
	}
	virtual string blaf() const =0;
};

class Tekkel: public Hond {
public:
	virtual string blaf() const {
		return "Kef kef ";
	}
};

class StBernard: public Hond {
public:
	virtual string blaf() const {
		return "Woef woef ";
	}
};

// handige template:
template<typename Container, typename Functor> void for_all(Container& c, Functor f) {
	for_each(c.begin(), c.end(), f);
}

int main() {
	list<Hond*> kennel;
	kennel.push_back(new Tekkel);
	kennel.push_back(new StBernard);
	kennel.push_back(new Tekkel);
//	blaffen zonder naam
	for_all(kennel, [](Hond* h) {
		cout<<h->blaf();
	});
	cout<<endl;
//	alle honden heten "Fikkie"
	for_all(kennel, [](Hond* h) {
		h->geefNaam("Fikkie");
	});
//	blaffen met naam
	for_all(kennel, [](Hond* h) {
		cout<<h->naam()<<":"<<h->blaf();
	});
	cout<<endl;
	cin.get();
	return 0;
}

